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

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

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

Иногда цикл перестает работать. Имеется следующая структура кода:
  
public static volatile bool _shouldStop = true;
 
// Создаю поток, в котором запускаю метод Work. 
//Я хотел бы чтобы он постоянно работал в цикле, проверяя условия, 
//для возможного выставления ордеров, работы с ними и с аккаунтом.
private void buttonStart_Click(object sender, EventArgs e)
{
      Thread workerThread = new Thread(WorkGroup.Work);
      workerThread.Priority = ThreadPriority.Highest;
      workerThread.Start(); //запускаем поток
 
      while (!workerThread.IsAlive);
      Thread.Sleep(1);
}
     
public class WorkGroup
{
      public static void BUY()
      public static void SELL()
      public static void DoWork()
      { 
            // необходимо чтобы данный цикл постоянно выполнялся, пока не изменится состояние переменной _shouldStop в false
            while (_shouldStop)
            {
 
                   //Если условия соблюдаются, то продаем или покупаем
                    ...
                   BUY();
                   SELL();
            }
      }
      .. и другие методы для работы с ордерами и аккаунтом
      public static void RequestStop()
      {
           _shouldStop = true;
      }
}
Часто этот цикл while (_shouldStop).. перестает работать, ордера висят, не переставляются. Ставлю точки останова, а отладчик не останавливается. Стоит сделать следующие действия:
private void Stop_Click(object sender, EventArgs e)
{
     WorkGroup.RequestStop();
}
и снова создать поток
private void buttonStart_Click(object sender, EventArgs e)
{
      Thread workerThread = new Thread(WorkGroup.Work);
      workerThread.Priority = ThreadPriority.Highest;
      workerThread.Start(); //запускаем поток
 
      while (!workerThread.IsAlive);
      Thread.Sleep(1);
}
как всё вновь начинает работать на непродолжительное время. Подскажите что я делаю не так? Стоит куча обработчиков исключений на обращения к серверу. Зацикливания в коде нигде не может быть. Возможно передается управление к другому потоку? Ещё заметил, что если в цикле точка останова не срабатывает, и в это время на сайте висит ордер - при его удалении цикл начинает работать. Подскажите, пожалуйста, что я делаю не так, может где логика хромает, а может где вообще отсутствует..)

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

textual
Листинг программы
            public static void GetBalances()
            {
                try
                {
                    var nonce = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
 
                    var uri = string.Format("........../api/v1.1/account/getbalances?APIKEY={0}&nonce={1}", APIKEY, nonce);
                    var hmac = new HMACSHA512(Encoding.UTF8.GetBytes(SECRETS));
                    var sign = BitConverter.ToString(hmac.ComputeHash(Encoding.UTF8.GetBytes(uri))).ToLower().Replace("-", "");
 
                    using (var http = new HttpClient())
                    {
                        http.Timeout = TimeSpan.FromSeconds(2);
                        try
                        {
                            http.DefaultRequestHeaders.Add("apisign", sign);
                            execResultGetBalances = http.GetStringAsync(uri).Result;  // Данная строчка периодически выкидывает исключение "Произошла одна или несколько ошибок." "отменена задача".
//   в System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
//   в System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
//   в System.Threading.Tasks.Task`1.get_Result()
                        }
                        catch (Exception ex)
                        {
                            if (File.Exists("Error.txt"))
                            {
                                using (StreamWriter sw = File.AppendText("Error.txt"))
                                {
                                    string add_string = (ex.Message + "\n--->\n" + ex.StackTrace + "\n\n");
                                    sw.WriteLine("GetBalances: " + add_string + " - " + DateTime.Now.ToString("HH:mm:ss"));
                                }
                                GetBalances();
                            }
                        }
                     ... обработка json..
                    }
                 }

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


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

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

9   голосов , оценка 3.667 из 5
Похожие ответы