C#args.Cancel=true;不停止我的工作线程
我有一个控制一些工业过程的应用程序。其中一些进程非常耗时,因此应用程序会创建一个工作线程来运行它们。线程设置为可取消并报告进度C#args.Cancel=true;不停止我的工作线程,c#,multithreading,C#,Multithreading,我有一个控制一些工业过程的应用程序。其中一些进程非常耗时,因此应用程序会创建一个工作线程来运行它们。线程设置为可取消并报告进度 CertifyBWThread.WorkerSupportsCancellation = true; // this allows the worker to report progress during work CertifyBWThread.WorkerReportsProgress = true; 提供了一个按钮,用于在线程正常完成之前
CertifyBWThread.WorkerSupportsCancellation = true;
// this allows the worker to report progress during work
CertifyBWThread.WorkerReportsProgress = true;
提供了一个按钮,用于在线程正常完成之前取消线程
if (CertifyBWThread != null)
{
CertifyBWThread.CancelAsync();
}
当线程运行时,它会定期检查是否已计划取消。args是dowworkeventargs
//check for cancellation here
if (CertifyBWThread.CancellationPending)
{
args.Cancel = true;
}
。。。我经常在调试器中点击这段代码。调用CancelAsync()后,它会通过控制工业流程并将args.Cancel设置为true的循环,每次都会遇到这个问题。但这条线仍然在欢快地走着。当args.Cancel设置为true时会发生什么情况?当您的DoWork()
处理程序检查CancellationPending
时,仅将DoWorkEventArgs.Cancel设置为true
是不够的。您的DoWork
处理程序也必须停止工作
将dowworkeventargs.Cancel
设置为true
很重要,因为BackgroundWorker
对象本身将能够区分dowwork
处理程序在取消操作后返回和实际完成操作后返回之间的区别。这解决了尝试取消操作的代码与操作本身之间可能存在的争用情况(即,通过这种方式,尝试取消操作的代码可以确定操作是否已实际取消,或者是否在有机会检查取消之前成功完成)
但是由您自己编写DoWork
事件处理程序,这样当CancellationPending
属性设置为true
时,它实际上会中断其操作
我是根据您问题中不完整代码示例的推论得出这个答案的。如果上述内容不能解决您的问题,然后,请改进您的问题,使其包含可靠地再现问题的内容。工作线程需要检查CancellationPending
,以确定它是否应该停止并退出。@Ron Beyer我没有在代码中显示它吗?该代码中是否缺少return
?是。@usr它已发布-您没有看到注释中的代码“//检查取消挂起”。正如我所说,在调试器中,它确实执行将cancel设置为true的行。