Отмена поддержки BackgroundWorker

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

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

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

3 ответа

Решение

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

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

//...
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
   do
   {
       provideNextChunk();
       expensiveMethod();
   }
   while (hasMoreData && !args.Cancel);
}

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

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

Другие вопросы по тегам