【问题标题】:Cancelling a background worker without worker.CancellationPending check?取消没有工作的后台工作人员。取消等待检查?
【发布时间】:2014-03-11 12:20:35
【问题描述】:

我有一个Validator 类,它有一个Validate 函数,这个验证函数循环遍历一堆文件并验证它们。用户可以取消验证过程。

为了取消后台工作人员,我需要在 Validtor 类中引用后台工作人员实例(用于取消验证过程)并在其上调用 CancellationPending

但问题是 Validator 类不能引用后台工作器,因为有时我们会同步调用“Validate”函数,而 Validator 类不必知道这一点。

到目前为止,我已经尝试用一些标志替换 backgroundworker.CancellationPending 检查,例如IsCanceled 这似乎不起作用。

【问题讨论】:

  • 您可以将您的工作封装在一个 while(!Abort) 调用中并设置字段,但我建议您考虑使用 Task 执行 CPU 密集型工作,它支持 CancellationTokens

标签: c# backgroundworker


【解决方案1】:

你有两个选择:

  1. Validate 方法进行两次重载。一种是同步的,一种是异步的且可取消的。
  2. 更改您的 Validate 方法,以便调用代码负责循环文件(考虑使用迭代器方法,使用 yield

我会选择选项 1,因为它是一个较小的变化。

【讨论】:

  • 问题是我无法在验证类中保留对后台工作人员的引用,因为验证逻辑不必知道它是否在后台线程中运行。第二个选项是不可能的,因为我有不同类型的验证器类,每个都实现“IValidate”接口。
  • @naveen 我的解决方案是为验证器上的异步操作提供便利。如果你想能够取消中间操作,实现该操作的代码必须改变。
猜你喜欢
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多