Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#args.Cancel=true;不停止我的工作线程_C#_Multithreading - Fatal编程技术网

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的行。