Отмена поддержки 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), без необходимости исключений.