我有一个控制一些工业流程的应用程序。其中一些过程非常耗时,因此应用程序会创建一个工作线程来运行它们。线程设置为可取消并报告进度。
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时应该发生什么?
答案 0 :(得分:2)
当您的DoWork()
处理程序检查CancellationPending
时,仅将DoWorkEventArgs.Cancel
设置为true
是不够的。您的DoWork
处理程序必须也停止工作。
将DoWorkEventArgs.Cancel
设置为true
非常重要,因为这就是BackgroundWorker
对象本身如何能够区分退回取消操作的DoWork
处理程序和实际上已经完成了操作。这解决了尝试取消操作的代码与操作本身之间可能的竞争条件(即,尝试取消操作的代码可以确定操作是否实际上已取消,或者是否在有机会检查之前成功完成关于取消)。
但由你来编写DoWork
事件处理程序,以便在CancellationPending
属性设置为true
时实际上会中断其操作
我根据您问题中不完整的代码示例推断出这个答案。如果上述问题无法解决您的问题,请改进您的问题,使其包含可靠地重现问题的a good, minimal, complete code example。