1

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

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

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

应该检查取消是否挂起,然后将取消标志设置为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

谢谢

4

2 回答 2

9

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

BackgroundWorker obackgroundworker = (BackgroundWorker)sender;
if (obackgroundworker.CancellationPending == true)
{
     e.Cancel = true;
     return;
}
于 2009-11-10T09:43:41.157 回答
5

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

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

请注意 return 语句,以便该方法完成。

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

于 2009-11-10T09:41:38.090 回答