2009-11-10 75 views
1

我打电话 obackgroundworker.CancelAsync(); 在后台工作目前正在做一些工作,在另一个线程,然后使用 而(obackgroundworker.IsBusy ==真) 等待它退出应用程序(如果之前在线程是远离处理的用户改变主意完成我想关闭干净)后台工作者类取消,设置取消挂起标志,但不退出

平注销挂起设置为正确真实的,但是线程不退出,在工作线程我有:

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

这是obackgroundworker.IsBusy的正确用法?我打电话取消后会不会变成错误?目前,即使线程已被请求取消,仍存在无限循环。 – Nath 2009-11-10 10:48:30

回答

9

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

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

当然,谢谢:) – Nath 2009-11-10 09:46:27

4

没有,只是设置该属性不会导致线程终止。那时你应该从你的方法中返回。例如,下面是第一条链接中的代码:

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

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

当然,如果你是通过深层次的方法来做到这一点的话,你需要确保调用者知道要终止等等 - 但通常对于后台工作者线程来说,它是“top级别“的方法,无论如何检查CancellationPending财产,所以通常只是返回罚款。