2009-07-28 73 views
4

我有一個應用程序,啓動10個線程。 每個線程是否工作並等待(使用生產者消費者模型)。所以當更多的工作出現時,其中一個線程被解鎖並且完成工作。如果線程死亡或凍結,您應該編碼嗎?

一位同事在工作中堅持我應該寫一些代碼來監視線程「以防萬一」他們凍結/不迴應或死亡。

到目前爲止,在我的測試中,他們工作正常,並正確關閉。

我的問題是「我應該把代碼放在這麼做嗎?」?如果是這樣,「我如何監控線程並檢查它的狀態」?

謝謝。 JD

+4

你在做什麼樣的線程監測?如果它「凍死」會發生什麼? – 2009-07-28 20:31:47

+0

每個線程都有一個要做的工作,它對應於數據庫中的記錄。隨着線程的工作,它會更新記錄。如果線程凍結或死亡,那麼如果自上次更新以來已經過了大約10分鐘,另一個線程清除該記錄並使其可供另一個線程使用。 至於你的問題,我想從主線程啓動一個新的線程,並會做監測(但在這個階段什麼都沒有決定)? 我的另一個問題是,如果線程凍結,我將需要啓動一個新的線程。我會怎麼做? – 2009-07-28 21:15:10

+0

你可能想重新考慮你的設計......每個DB記錄有一個線程???? !!?!?!? – Janie 2009-07-28 22:00:32

回答

5

這真的取決於情況。首先,你應該關注正確性,使其不會凍結或死亡,但如果你需要更多的可靠性,你應該首先考慮如何從這種情況中恢復正常。你應該思考它爲什麼會凍結或死亡,如果它真的存在,現在你可以做什麼。如果你無法做出任何可以從這種情況中可靠恢復的事情,那麼你甚至不應該嘗試。如果可以做到這一點而不會使情況變得更糟,那麼你可以去嘗試這樣做。

顯然,如果你做出了這樣的選擇,你必須小心,不要把事情搞砸,並引入一些錯誤,這些錯誤實際上會讓壞的事情發生。

4

理想情況下否,您的線程應該能夠正常完成。監測它們不值得複雜和處理時間。如果你做得對,你就不需要監控。

-1

即使您只是強制重新啓動線程,您也應該始終編寫線程可能掛起或死亡的機會。

2

假設您使用.NET Framework 2或更高版本進行編碼,工作線程中的未處理異常將會終止整個應用程序。

除非你確定你的線程代碼不會拋出異常(或者保留內存,或者抓住一個句柄,或者調用你沒有編寫的框架代碼......),否則你首先需要的是寫入你的線程入口方法是一個try/catch。

2

如果你的線程花費了很多時間等待工作,你可以考慮重構你的應用程序以使用System.Threading.ThreadPool類。這樣做會將大部分線程管理卸載到框架中。

1

線程不會掛起或死亡,除非用戶代碼中存在錯誤。操作系統/框架崩潰的可能性是微不足道的,以至於實際上,這是不可能的。這就像擔心硬盤不能寫入文件,即使File.WriteAllBytes()成功。它只是不會發生。

也就是說,wildcard提出了一個很好的觀點,即工作線程中的未處理異常作爲整個AppDomain的未處理異常填充。

0

最好的方法是使用「ThreadPool」並調用ThreadPool.QueueUserWorkItem和.Net非常有效地管理ThreadPool。

你可以設置最大線程數分配,你不需要做任何等待操作等。你也可以得到WaitHandle等待完成。而且你不需要管理線程的阻塞/解鎖。

相關問題