我打电话 obackgroundworker.CancelAsync(); 在一个后台工作者当前在另一个线程中做一些工作,然后使用 而(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
谢谢
答案 0 :(得分:9)
将e.Cancel
设置为true并不会停止BackgroundWorker
的执行,它只表示操作已取消,以便您可以在RunWorkerCompleted
事件中进行检查。您需要通过从DoWork
事件处理程序返回来停止任务:
BackgroundWorker obackgroundworker = (BackgroundWorker)sender;
if (obackgroundworker.CancellationPending == true)
{
e.Cancel = true;
return;
}
答案 1 :(得分:5)
不,只是设置属性不会导致线程终止。那时你应该从你的方法返回。例如,这是来自第一个链接的代码:
if (bw.CancellationPending) {
e.Cancel = true;
return;
}
请注意return语句,以便该方法完成。
当然,如果你是从堆栈深处的某个方法执行此操作,则需要确保调用者也知道终止等等 - 但通常对于后台工作线程,它是“顶级” “无论如何都要检查CancellationPending
属性的方法,所以通常只返回就好了。