Так что я играл с потоками в течение последних нескольких месяцев, и хотя мой результат такой, как и ожидалось, у меня есть ощущение, что я делаю это не лучшим образом.Кажется, я не могу получить прямой ответ от кого-то, с кем я работаю, о том, что является лучшей практикой, поэтому я подумал, что спрошу вас, ребята.
Вопрос: Я постараюсь сделать это простым, так что терпитемне.Скажем, у меня есть форма с кнопкой запуска и остановки.Кнопка запуска срабатывает и событие запускает поток.Внутри этого потока DoWork
он будет вызывать 3 метода.Method1 () печатает на консоль «A \ n» 10 раз с паузой в 10 секунд между ними.Method2 () и Method3 () - это одно и то же, просто разные буквы и разное время паузы между Console.WriteLine
.Теперь, когда вы нажимаете кнопку «Стоп», вы хотите, чтобы ответ был немедленным.Я не хочу ждать завершения методов.Как я могу это сделать?
То, как я это делал, передает мой BackgroundWorker каждому методу и проверяет работника. Отмена отложенных транзакций выглядит так
public void Method1(BackgroundWorker worker)
{
for(int i = 0; i < 10 && !worker.CancellationPending; ++i)
{
Console.WriteLine("A");
for(int j = 0; j < 100 && !worker.CancellationPending; ++i)
{
Thread.Sleep(100);
}
}
}
Как я уже сказал, это дает мнежелаемый результат, однако, представьте, что method1 становится намного более сложным, скажем, он использует DLL для записи, которая имеет keydown и key up.Если бы я просто прервал поток, я мог бы также оставить себя в нежелательном состоянии.Я засоряю свой код !worker.CancellationPending
.Практически в каждом блоке кода я проверяю CancellationPending.Я смотрю на множество примеров в сети и редко вижу, как люди передают поток, как я.Что такое лучшие практики по этому вопросу?