.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..
}
}