首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# args.Cancel = true;不停止工作线程

C# args.Cancel = true;不停止工作线程
EN

Stack Overflow用户
提问于 2015-11-12 17:59:39
回答 1查看 299关注 0票数 0

我有一个控制某些工业过程的应用程序。这些进程中有一些是耗时的,因此应用程序创建一个工作线程来运行它们。线程被设置为可取消并报告进度。

代码语言:javascript
运行
复制
    CertifyBWThread.WorkerSupportsCancellation = true;
    // this allows the worker to report progress during work
    CertifyBWThread.WorkerReportsProgress = true;

在线程正常完成之前,会提供一个按钮来取消线程。

代码语言:javascript
运行
复制
if (CertifyBWThread != null)
{
    CertifyBWThread.CancelAsync();
}

当线程运行时,它会定期检查是否计划了取消。args是DoWorkEventArgs

代码语言:javascript
运行
复制
//check for cancellation here
if (CertifyBWThread.CancellationPending)
{
    args.Cancel = true;                
}

..。我经常在调试器中点击这段代码。一旦我调用了CancelAsync(),它每次都会通过一个控制工业过程并将args.Cancel设置为true的循环来实现这个目标。但这条线仍在欢快地运行着。当args.Cancel设置为真时,应该发生什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-12 18:21:16

DoWork()处理程序检查CancellationPending时,仅仅将DoWorkEventArgs.Cancel设置为true是不够的。您的DoWork处理程序也必须停止工作。

DoWorkEventArgs.Cancel设置为true很重要,因为这样BackgroundWorker对象本身就能够区分取消操作返回的DoWork处理程序与实际完成操作的DoWork处理程序之间的区别。这解决了试图取消操作的代码与操作本身之间的可能竞争条件(也就是说,试图取消操作的代码可以确定操作实际上是否已被取消,或者在有机会检查取消操作之前是否已成功完成)。

但是,应该由您编写DoWork事件处理程序,以便在CancellationPending属性设置为true时,它实际上会中断其操作。

我的答案是基于您问题中不完整代码示例的推论。如果以上没有解决您的问题,那么请改进您的问题,使其包括 code example,可靠地再现问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33678185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档