C# 正在取消没有工作进程的后台工作进程。取消挂起检查?

C# 正在取消没有工作进程的后台工作进程。取消挂起检查?,c#,backgroundworker,C#,Backgroundworker,我有一个Validator类,它有一个Validate函数,这个Validate函数在一堆文件上循环并验证它们。用户可以取消验证过程 要取消后台工作人员,我需要Validtor类中后台工作人员实例的ta引用(用于取消验证过程),并对其调用CancellationPending 但问题是验证器类不能引用后台工作程序,因为有时我们会同步调用“Validate”函数,而验证器类不必知道这一点 到目前为止,我已尝试替换backgroundworker.CancellationPending检查一些标志,

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

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

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

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

您有两个选择:

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

  • 我会选择选项1,因为它是一个较小的更改。

    您可以在(!Abort)调用时将您的工作包装在
    中,并设置字段,但我建议您考虑使用
    任务
    执行CPU密集型工作,它支持
    CancellationTokens
    问题是我不能在validate类中保留对后台工作者的引用,因为验证逻辑不必知道它是否在后台线程中运行。第二个选项不可能,因为我有不同类型的验证程序类,每个类都实现“IValidate”接口。@naveen我的解决方案是为validtor上的异步操作提供便利。如果希望能够取消中间操作,则实现该操作的代码必须更改。