Пишу программу с опросом пула модемов (они на 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();
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники