Пишу программу с опросом пула модемов (они на COM - портах) перебор портов осуществляется в бесконечном цикле
do
{
....
}
while(true)
Чтобы этот цикл не вешал UI программы, он "крутится" под управлением BackgroundWorker
. Информация о портах(занят он или свободен) выводится "наружу" в виде событий. Так же в виде событий тот или иной порт "занимается" или "освобождается".
Все работает отлично, за исключением одного момента: Однажды запустив BackgroundWorker
, я уже не могу его остановить. Стандартная процедура с bw.CancelAsync();
тут не работает, поскольку внутри крутится бесконечный цикл.
Может кто-то подскажет, как мне поступить?
Отмена операции должна быть кооперативной => в вашем бесконечном цикле нужно время от времени производить опрос BackgroundWorker.CancellationPending
и вываливаться в случае отмены операции.
Приведу пример из старого проекта
_backgroundWorker = new BackgroundWorker { WorkerSupportsCancellation = true };
_backgroundWorker.DoWork += (s, a) =>
{
while (true)
{
RefreshTemperature();
if (_backgroundWorker.CancellationPending)
break;
Thread.Sleep(30000);
}
};
_backgroundWorker.RunWorkerAsync();
Это все в одном месте.
И когда нам нужно остановить выполнение используем _backgroundWorker.CancelAsync();
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Вывод 1970-01-01 03:00:47 Почему так? должно же быть 0000-00-00 00:00:47
Я не программист, но занимаюсь одним сайтом как администраторПотребовалось прибавить к дате 1 день