C # BackgroundWorker Отмена с помощью вспомогательной функции - PullRequest
0 голосов
/ 12 июля 2010

Обычно, когда я хочу отменить backgroundWorker в C #, я делаю что-то вроде этого:

     while (backgroundWorker1.IsBusy)
     {
        backgroundWorker1.CancelAsync();
        autoResetEvent1.WaitOne(BGW_CANCEL_TIMEOUT);
     }

В одном приложении есть несколько backgroundWorkers.Допустимо ли использовать вспомогательную функцию для отмены backgroundWorkers, как это?имея функцию.Основная цель этой функции - уменьшить пространство кода и сделать код приложения более читабельным / поддерживаемым.

Ответы [ 2 ]

2 голосов
/ 12 июля 2010

Нет, это не хорошо. Это вызывает взаимоблокировку, когда BGW имеет обработчик события RunWorkerCompleted. Этот обработчик не может работать до тех пор, пока основной поток не перейдет в режим ожидания и не войдет в цикл обработки сообщений. Свойство IsBusy будет оставаться True до тех пор, пока этот обработчик события не завершится.

У вас есть тайм-аут на вызов WaitOne, поэтому, по крайней мере, ваша программа не зависает полностью. Но когда WaitOne () возвращается, BGW не еще не завершен, обработчик событий RWC еще не запущен. Единственной практической альтернативой является то, что обработчик событий RWC должен выполнить все необходимые действия после завершения отмены.

0 голосов
/ 12 июля 2010

Ваш код неверен.

Вызов CancelAsync просто устанавливает флаг CancellationPending на BackgroundWorker на true.Ваш код в событии DowWork должен периодически проверять этот флаг и останавливаться, если флаг true.

Многократный вызов CancelAsync не принесет пользы, и не должно быть никакогопричина заморозить поток пользовательского интерфейса, пока он фактически не отменит.

...