【问题标题】:background worker class cancellation, sets cancellation pending flag but doesn't quit后台工人类取消,设置取消挂起标志但不退出
【发布时间】:2009-11-10 09:37:12
【问题描述】:

我打电话 obackgroundworker.CancelAsync(); 在后台工作人员当前在另一个线程中做一些工作,然后使用 而(obackgroundworker.IsBusy == true) 在退出应用程序之前等待它完成(以防用户在线程不在处理时改变主意并且我想干净地关闭)

取消挂起的平面正确设置为true,但线程没有退出,在我拥有的工作线程中:

backgroundworker obackgroundworker = (backgroundworker)sender;
if (obackgroundworker.cancellationpending == true)
     e.cancel = true;              

应该检查取消是否挂起,然后将取消标志设置为真,我认为这也会导致线程实际终止......?还是在检测到取消实际结束时我需要从线程调用其他函数?

我已经阅读了很多使用与上面完全相同的后台工作人员的示例,并且没有报告任何问题。

来源:

http://www.albahari.com/threading/part3.aspx http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx

谢谢

【问题讨论】:

  • 这是obackgroundworker.IsBusy的正确用法吗?在我打电话取消后,这会变成假吗?目前,即使在请求取消线程之后,也存在无限循环。

标签: c# backgroundworker request-cancelling


【解决方案1】:

e.Cancel 设置为true 并不会停止BackgroundWorker 的执行,它只是表示操作已被取消,以便您可以在RunWorkerCompleted 事件中检查它。您需要通过从 DoWork 事件处理程序返回来停止任务:

BackgroundWorker obackgroundworker = (BackgroundWorker)sender;
if (obackgroundworker.CancellationPending == true)
{
     e.Cancel = true;
     return;
}

【讨论】:

    【解决方案2】:

    不,只是设置属性不会导致线程终止。此时您应该从您的方法返回。例如,这是您的第一个链接中的代码:

    if (bw.CancellationPending) {
        e.Cancel = true;
        return;
    }
    

    注意return语句,以便方法结束。

    当然,如果您是从堆栈深处的某个方法执行此操作,则需要确保调用者也知道终止,等等 - 但通常对于后台工作线程,它是“顶级" 无论如何检查CancellationPending 属性的方法,所以通常只返回就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-09
      • 2018-12-13
      • 2012-01-13
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多