Пишу программу с опросом пула модемов (они на 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();
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости