2012-10-30 50 views
5

我試圖想出一個辦法來驗證一個BackgroundWorker線程是活的(即仍在運行的線程是一個簡單的無限循環的基本實現:BackgroundWorker的IsBusy與「IsAlive」相同嗎?

while (AllConditionsMet()) 
{ 
    DoSomeMagic(); 
    Thread.Sleep(10000); 
} 

的最接近IsAlive()我發現至今是IsBusy財產,但考慮到我的線程睡眠()■大部分的時間,我不知道這是否會做工作

我能指望IsBusy做:

if (!myWorker.IsBusy) 
    RestartWorker(); 

還是我呼喚麻煩?

+1

如果isBusy爲false Backgroundworker沒有做任何工作,所以你不會因使用顯示的代碼而陷入困境。 只有「RestartWorker()」方法是錯誤的,因爲Worker尚未啓動。但這更像是一種語言,而不是編程問題。 – jAC

+2

如果您在線程中實現代碼以自行重新啓動,您正在尋求麻煩。你會更好,檢測失敗情況,結束該線程並重新啓動一個全新的線程。否則,你很可能會陷入僵局。 –

回答

12

BackgroundWorker.IsBusy只要DoWork事件處理程序忙 RunWorkerCompleted事件處理程序尚未運行尚未成立。請注意後面的條款,屬性不是告訴你,如果你的循環是活躍的。

此外,您的第二個片段中存在相當討厭的競爭條件。 IsBusy在if()聲明中可能是真實的,但在納秒後會失效。那種每個月都會發生一次的種族。代碼的意圖很難從片段中理解,因此很難提供解決方法。考慮一直創建一個新的BGW對象,這永遠不會競賽。也有助於擺脫那個循環,睡眠10秒的線程浪費了一個非常昂貴的系統資源,無所事事。它會阻塞線程池計劃程序。

4

docs

,如果BackgroundWorker的正在運行的異步操作;否則,虛假

不管你睡覺工作者線程與否,它仍然這樣使用IsBusy應該罰款東西。

5

爲了確保Backgroundworker真的停止了,你可以手動殺死它。 Set yourBackgroundWorker.WorkerSupportsCancellation = true;。 然後簡單地停止BackgroundWorker的:

yourBackgroundWorker.CancelAsync(); 

還是isBusy應該足以檢測到您的BackgroundWorker的運行/工作實例。