C#args.Cancel = true;没有阻止我的工作线程

时间:2015-11-12 17:59:39

标签: c# multithreading

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

    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(),它每次都会通过一个控制工业过程的循环来命中它,并将args.Cancel设置为true。但仍然愉快的线程运行。当args.Cancel设置为true时应该发生什么?

1 个答案:

答案 0 :(得分:2)

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

DoWorkEventArgs.Cancel设置为true非常重要,因为这就是BackgroundWorker对象本身如何能够区分退回取消操作的DoWork处理程序和实际上已经完成了操作。这解决了尝试取消操作的代码与操作本身之间可能的竞争条件(即,尝试取消操作的代码可以确定操作是否实际上已取消,或者是否在有机会检查之前成功完成关于取消)。

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


我根据您问题中不完整的代码示例推断出这个答案。如果上述问题无法解决您的问题,请改进您的问题,使其包含可靠地重现问题的a good, minimal, complete code example