фоновое удаление класса рабочего, устанавливает флаг ожидания отмены, но не выходит - PullRequest
1 голос
/ 10 ноября 2009

звоню obackgroundworker.CancelAsync (); на фоне работника в настоящее время делает некоторую работу в другом потоке, а затем с помощью while (obackgroundworker.IsBusy == true) дождаться его завершения, прежде чем выйти из приложения (в случае, если пользователь передумает, пока поток не обрабатывает, и я хочу полностью закрыть)

Квартира для отмены отмены установлена ​​на true, но поток не завершается, в рабочем потоке у меня есть:

backgroundworker obackgroundworker = (backgroundworker)sender;
if (obackgroundworker.cancellationpending == true)
     e.cancel = true;              

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

Я прочитал много примеров, в которых используются фоновые рабочие, как и выше, и не сообщают о каких-либо проблемах.

Источники:

http://www.albahari.com/threading/part3.aspx http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx

Спасибо

Ответы [ 2 ]

9 голосов
/ 10 ноября 2009

Установка e.Cancel в значение true не останавливает выполнение BackgroundWorker, это только означает, что операция была отменена, так что вы можете проверить ее в событии RunWorkerCompleted. Вам нужно остановить задачу, вернувшись из обработчика событий DoWork:

BackgroundWorker obackgroundworker = (BackgroundWorker)sender;
if (obackgroundworker.CancellationPending == true)
{
     e.Cancel = true;
     return;
}
5 голосов
/ 10 ноября 2009

Нет, просто установка свойства не приведет к завершению потока. Вы должны вернуться от вашего метода в этот момент. Например, вот код из первой вашей ссылки:

if (bw.CancellationPending) {
    e.Cancel = true;
    return;
}

Обратите внимание на оператор return, чтобы метод завершился.

Конечно, если вы делаете это с помощью какого-то метода, находящегося глубоко в стеке, вам нужно убедиться, что вызывающий объект также знает, что он завершается, и т. Д., - но обычно для фоновых рабочих потоков это «верхний уровень». "метод, который проверяет свойство CancellationPending в любом случае, поэтому обычно достаточно просто вернуть.

...