我有一个控制某些工业过程的应用程序。这些进程中有一些是耗时的,因此应用程序创建一个工作线程来运行它们。线程被设置为可取消并报告进度。
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设置为真时,应该发生什么?
发布于 2015-11-12 18:21:16
当DoWork()
处理程序检查CancellationPending
时,仅仅将DoWorkEventArgs.Cancel
设置为true
是不够的。您的DoWork
处理程序也必须停止工作。
将DoWorkEventArgs.Cancel
设置为true
很重要,因为这样BackgroundWorker
对象本身就能够区分取消操作返回的DoWork
处理程序与实际完成操作的DoWork
处理程序之间的区别。这解决了试图取消操作的代码与操作本身之间的可能竞争条件(也就是说,试图取消操作的代码可以确定操作实际上是否已被取消,或者在有机会检查取消操作之前是否已成功完成)。
但是,应该由您编写DoWork
事件处理程序,以便在CancellationPending
属性设置为true
时,它实际上会中断其操作。
我的答案是基于您问题中不完整代码示例的推论。如果以上没有解决您的问题,那么请改进您的问题,使其包括 code example,可靠地再现问题。
https://stackoverflow.com/questions/33678185
复制相似问题