Отмена поддержки BackgroundWorker - PullRequest
3 голосов
/ 21 февраля 2012

Я использую BackgroundWorker, но у меня есть проблема с отменой отчетов:

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
    expensiveMethod();
}

DoWork должен периодически проверять, ожидает ли запрос отмены.Как это сделать, если я не могу изменить дорогой метод?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Если вы не можете изменить expensiveMethod(), то прямого способа обработки отмены не существует.

Если expensiveMethod() работает с каким-то большим фрагментом данных, возможно, вы можете разделить эти данные и обработать меньший (не так долго) куски в цикле и после каждой итерации проверяют флаг отмены.Как то так:

//...
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
   do
   {
       provideNextChunk();
       expensiveMethod();
   }
   while (hasMoreData && !args.Cancel);
}
1 голос
/ 21 февраля 2012

BackgroundWorker предназначен для работы с потоками, которые на самом деле МОГУТ отвечать на запросы отмены.Если ваш дорогой Metod () не может этого сделать, я советую вам использовать System.Threading.Thread .Запустите его как background thread и используйте Thread.Abort () , чтобы отменить его.

0 голосов
/ 21 февраля 2012

Используйте Задание . Задачи используют потоки из ThreadPool (например, BackgroundWorker), но они поддерживают отмену (через CancellationToken ), без необходимости исключений.

...