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?
当DoWork()
处理程序检查CancellationPending
时,仅将DoWorkEventArgs.Cancel
设置为true
是不够的。您的DoWork
处理程序必须也停止工作。
将DoWorkEventArgs.Cancel
设置为true
很重要,因为这就是BackgroundWorker
对象本身能够区分DoWork
处理程序在取消操作后返回和在实际完成操作后返回之间的区别。这解决了试图取消操作的代码和操作本身之间可能存在的竞争条件(即,通过这种方式,尝试取消操作的程序可以确定操作是否实际上被取消,或者操作是否在有机会检查取消之前成功完成)。
但是,由您编写DoWork
事件处理程序,以便在CancellationPending
属性设置为true
时,它实际上会中断其操作。
我的答案是基于您问题中不完整代码示例的推断得出的。如果以上内容不能解决您的问题,请改进您的问题以使其包含一个良好的、最小、完整代码示例,从而可靠地再现问题。