.NET 4.x Гарантированно циклически выполнять действия в новом потоке (в цикле, без остановки) - C#
Формулировка задачи:
Иногда цикл перестает работать.
Имеется следующая структура кода:
Часто этот цикл while (_shouldStop).. перестает работать, ордера висят, не переставляются. Ставлю точки останова, а отладчик не останавливается. Стоит сделать следующие действия:
и снова создать поток
как всё вновь начинает работать на непродолжительное время. Подскажите что я делаю не так? Стоит куча обработчиков исключений на обращения к серверу. Зацикливания в коде нигде не может быть. Возможно передается управление к другому потоку? Ещё заметил, что если в цикле точка останова не срабатывает, и в это время на сайте висит ордер - при его удалении цикл начинает работать. Подскажите, пожалуйста, что я делаю не так, может где логика хромает, а может где вообще отсутствует..)
Листинг программы
- 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;
- }
- }
Листинг программы
- 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..
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д