【问题标题】:BackgroundWorker support cancelationBackgroundWorker 支持取消
【发布时间】:2012-02-21 10:28:16
【问题描述】:

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

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

DoWork 应定期检查取消请求是否处于待处理状态。如果我无法修改昂贵的方法,该怎么做?

【问题讨论】:

  • 有没有办法取消昂贵的方法?

标签: c# backgroundworker


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    BackgroundWorker 旨在与实际上可以响应取消请求的线程一起工作。如果您的昂贵方法()无法做到这一点,我建议您改用System.Threading.Thread。以background线程运行,使用Thread.Abort()取消。

    【讨论】:

      【解决方案3】:

      使用Task。 Tasks 使用 ThreadPool 中的线程(例如 BackgroundWorker),但它们支持取消(通过CancellationToken),不需要异常。

      【讨论】:

      • 这将是一个不错的选择,但 OP 说他不能修改 expensiveMethod(); 这算不算。
      猜你喜欢
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2023-03-23
      • 2018-03-18
      • 1970-01-01
      相关资源
      最近更新 更多