BackgroundWorker支持取消

时间:2012-02-21 10:28:16

标签: c# backgroundworker

我使用BackgroundWorker但报告取消时遇到问题:

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

DoWork应定期检查取消请求是否有待处理。怎么做,如果我不能修改昂贵的方法?

3 个答案:

答案 0 :(得分:2)

如果您无法修改expensiveMethod(),则无法直接处理取消。

如果expensiveMethod()正在处理大量数据,也许您可​​以拆分该数据并在循环中处理较小(不那么冗长)的块,并在每次迭代后检查取消标记。像这样:

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

答案 1 :(得分:1)

BackgroundWorker旨在使用实际可以响应取消请求的线程。如果您的昂贵的方法()无法做到,我建议您改用System.Threading.Thread。将其作为background主题运行,并使用Thread.Abort()取消它。

答案 2 :(得分:0)

使用Task。任务使用ThreadPool中的线程(例如BackgroundWorker),但它们支持取消(通过CancellationToken),而无需例外。