Остановка BackgroundWorker в бесконечном цикле

183
06 июля 2019, 21:00

Пишу программу с опросом пула модемов (они на COM - портах) перебор портов осуществляется в бесконечном цикле

 do
 {
 ....
 }
 while(true)

Чтобы этот цикл не вешал UI программы, он "крутится" под управлением BackgroundWorker. Информация о портах(занят он или свободен) выводится "наружу" в виде событий. Так же в виде событий тот или иной порт "занимается" или "освобождается". Все работает отлично, за исключением одного момента: Однажды запустив BackgroundWorker, я уже не могу его остановить. Стандартная процедура с bw.CancelAsync(); тут не работает, поскольку внутри крутится бесконечный цикл.

Может кто-то подскажет, как мне поступить?

Answer 1

Отмена операции должна быть кооперативной => в вашем бесконечном цикле нужно время от времени производить опрос BackgroundWorker.CancellationPending и вываливаться в случае отмены операции.

Answer 2

Приведу пример из старого проекта

_backgroundWorker = new BackgroundWorker { WorkerSupportsCancellation = true };
_backgroundWorker.DoWork += (s, a) =>
{
  while (true)
  {
    RefreshTemperature();
    if (_backgroundWorker.CancellationPending)
       break;
    Thread.Sleep(30000);
  }
};

_backgroundWorker.RunWorkerAsync();

Это все в одном месте.

И когда нам нужно остановить выполнение используем _backgroundWorker.CancelAsync();

READ ALSO
PHP Почему насчитывает лишнее время?

PHP Почему насчитывает лишнее время?

Вывод 1970-01-01 03:00:47 Почему так? должно же быть 0000-00-00 00:00:47

135
Порядок выполнения тестовых файлов Codeception

Порядок выполнения тестовых файлов Codeception

Проблема состоит в следующем

146
Как прибавить к дате 1 день?

Как прибавить к дате 1 день?

Я не программист, но занимаюсь одним сайтом как администраторПотребовалось прибавить к дате 1 день

173
laravel не устанавливается пакет

laravel не устанавливается пакет

почему после команды

153