【问题标题】:C# args.Cancel = true; not stopping my worker threadC# args.Cancel = true;不停止我的工作线程
【发布时间】:2015-11-12 17:59:39
【问题描述】:

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

    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 时应该发生什么?

【问题讨论】:

  • 工作线程需要检查CancellationPending来确定它是否应该停止并退出。
  • @Ron Beyer 我不是在代码中显示了吗?
  • 该代码中是否缺少return?是的。
  • @usr 它已发布 - 你没有看到评论说“//检查此处未决的取消”的代码。正如我所说,在调试器中它确实执行了将取消设置为 true 的行。

标签: c# multithreading


【解决方案1】:

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

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

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


我将此答案基于您问题中不完整代码示例的推论。如果以上内容不能解决您的问题,请改进您的问题,使其包含可靠地重现问题的a good, minimal, complete code example。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多