.NET 4.x Гарантированно циклически выполнять действия в новом потоке (в цикле, без остановки) - C#

Узнай цену своей работы

Формулировка задачи:

Иногда цикл перестает работать. Имеется следующая структура кода:
Листинг программы
  1. public static volatile bool _shouldStop = true;
  2. // Создаю поток, в котором запускаю метод Work.
  3. //Я хотел бы чтобы он постоянно работал в цикле, проверяя условия,
  4. //для возможного выставления ордеров, работы с ними и с аккаунтом.
  5. private void buttonStart_Click(object sender, EventArgs e)
  6. {
  7. Thread workerThread = new Thread(WorkGroup.Work);
  8. workerThread.Priority = ThreadPriority.Highest;
  9. workerThread.Start(); //запускаем поток
  10. while (!workerThread.IsAlive);
  11. Thread.Sleep(1);
  12. }
  13. public class WorkGroup
  14. {
  15. public static void BUY()
  16. public static void SELL()
  17. public static void DoWork()
  18. {
  19. // необходимо чтобы данный цикл постоянно выполнялся, пока не изменится состояние переменной _shouldStop в false
  20. while (_shouldStop)
  21. {
  22. //Если условия соблюдаются, то продаем или покупаем
  23. ...
  24. BUY();
  25. SELL();
  26. }
  27. }
  28. .. и другие методы для работы с ордерами и аккаунтом
  29. public static void RequestStop()
  30. {
  31. _shouldStop = true;
  32. }
  33. }
Часто этот цикл while (_shouldStop).. перестает работать, ордера висят, не переставляются. Ставлю точки останова, а отладчик не останавливается. Стоит сделать следующие действия:
Листинг программы
  1. private void Stop_Click(object sender, EventArgs e)
  2. {
  3. WorkGroup.RequestStop();
  4. }
и снова создать поток
Листинг программы
  1. private void buttonStart_Click(object sender, EventArgs e)
  2. {
  3. Thread workerThread = new Thread(WorkGroup.Work);
  4. workerThread.Priority = ThreadPriority.Highest;
  5. workerThread.Start(); //запускаем поток
  6. while (!workerThread.IsAlive);
  7. Thread.Sleep(1);
  8. }
как всё вновь начинает работать на непродолжительное время. Подскажите что я делаю не так? Стоит куча обработчиков исключений на обращения к серверу. Зацикливания в коде нигде не может быть. Возможно передается управление к другому потоку? Ещё заметил, что если в цикле точка останова не срабатывает, и в это время на сайте висит ордер - при его удалении цикл начинает работать. Подскажите, пожалуйста, что я делаю не так, может где логика хромает, а может где вообще отсутствует..)

Решение задачи: «.NET 4.x Гарантированно циклически выполнять действия в новом потоке (в цикле, без остановки)»

textual
Листинг программы
  1.             public static void GetBalances()
  2.             {
  3.                 try
  4.                 {
  5.                     var nonce = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
  6.  
  7.                     var uri = string.Format("........../api/v1.1/account/getbalances?APIKEY={0}&nonce={1}", APIKEY, nonce);
  8.                     var hmac = new HMACSHA512(Encoding.UTF8.GetBytes(SECRETS));
  9.                     var sign = BitConverter.ToString(hmac.ComputeHash(Encoding.UTF8.GetBytes(uri))).ToLower().Replace("-", "");
  10.  
  11.                     using (var http = new HttpClient())
  12.                     {
  13.                         http.Timeout = TimeSpan.FromSeconds(2);
  14.                         try
  15.                         {
  16.                             http.DefaultRequestHeaders.Add("apisign", sign);
  17.                             execResultGetBalances = http.GetStringAsync(uri).Result;  // Данная строчка периодически выкидывает исключение "Произошла одна или несколько ошибок." "отменена задача".
  18. //   в System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
  19. //   в System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
  20. //   в System.Threading.Tasks.Task`1.get_Result()
  21.                         }
  22.                         catch (Exception ex)
  23.                         {
  24.                             if (File.Exists("Error.txt"))
  25.                             {
  26.                                 using (StreamWriter sw = File.AppendText("Error.txt"))
  27.                                 {
  28.                                     string add_string = (ex.Message + "\n--->\n" + ex.StackTrace + "\n\n");
  29.                                     sw.WriteLine("GetBalances: " + add_string + " - " + DateTime.Now.ToString("HH:mm:ss"));
  30.                                 }
  31.                                 GetBalances();
  32.                             }
  33.                         }
  34.                      ... обработка json..
  35.                     }
  36.                  }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы