2009-11-10 21 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財產,所以通常只是返回罰款。