C#参数.Cancel=true;没有停止我的工人线程

本文关键字:我的 线程 Cancel 参数 true | 更新日期: 2023-09-27 18:21:45

我有一个控制一些工业过程的应用程序。其中一些进程非常耗时,因此应用程序会创建一个工作线程来运行它们。线程设置为可取消,并报告进度。

    CertifyBWThread.WorkerSupportsCancellation = true;
    // this allows the worker to report progress during work
    CertifyBWThread.WorkerReportsProgress = true;

提供了一个按钮,用于在线程正常结束之前取消线程。

if (CertifyBWThread != null)
{
    CertifyBWThread.CancelAsync();
}

当线程运行时,它会定期检查是否已安排取消。args是DoWorkEventArgs

//check for cancellation here
if (CertifyBWThread.CancellationPending)
{
    args.Cancel = true;                
}

我经常在调试器中调用这些代码。一旦我调用了CancelAsync(),它每次都会通过一个控制工业流程和设置参数的循环来达到这个目的。取消为true。但这条线仍然愉快地运行着。args时应该发生什么。取消设置为true?

C#参数.Cancel=true;没有停止我的工人线程

DoWork()处理程序检查CancellationPending时,仅将DoWorkEventArgs.Cancel设置为true是不够的。您的DoWork处理程序必须停止工作。

DoWorkEventArgs.Cancel设置为true很重要,因为这就是BackgroundWorker对象本身能够区分DoWork处理程序在取消操作后返回和在实际完成操作后返回之间的区别。这解决了试图取消操作的代码和操作本身之间可能存在的竞争条件(即,通过这种方式,尝试取消操作的程序可以确定操作是否实际上被取消,或者操作是否在有机会检查取消之前成功完成)。

但是,由编写DoWork事件处理程序,以便在CancellationPending属性设置为true时,它实际上会中断其操作。


我的答案是基于您问题中不完整代码示例的推断得出的。如果以上内容不能解决您的问题,请改进您的问题以使其包含一个良好的、最小完整代码示例,从而可靠地再现问题。