.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.. } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д