2010-05-08 122 views
7

我有一個用.NET 3.5(c#)編寫的windows服務和一個System.Threading.Timer,它在每個回調中產生幾個線程。這些只是普通的線程(沒有線程池),我在每個線程上都設置了IsBackground = true,因爲我只會運行託管代碼。關閉具有線程的Windows服務

當用戶停止服務時,所有線程會發生什麼情況?他們優雅地死亡?我沒有任何通過調用join或abort來管理線程的代碼。假設IsBackground = true足以假定當用戶停止服務時線程將被處置並停止,是否正確?有人通過Service Manager GUI停止Windows服務時會發生什麼?它會在觸發OnStop事件後終止進程嗎?

這對我來說實際上是可以接受的,因爲我已經構建了一個單獨的機制,允許用戶在停止服務之前確定沒有線程。這是通過從Windows Service中運行的ServiceHost公開的2個WCF方法完成的。有一種方法可以停止產生新的線程,另一種方法可以查詢剩餘的線程數。

我只是好奇,如果跳過這些步驟,然後停止該服務會發生什麼......看來的IsBackground有助於實現這一目標:

回答

6

從您提供的MSDN鏈接:

一線程是後臺線程或前臺線程。後臺線程與前臺線程完全相同,只是後臺線程不會阻止進程終止。一旦屬於某個進程的所有前臺線程都終止,公共語言運行庫就結束該進程。 任何剩餘的後臺線程都會停止並且無法完成。

線程的IsBackground屬性設置爲true將使一旦OnStop()回調完成執行,所有前臺線程(如果有的話)已經退出你的Windows服務立即終止。後臺線程會在它們碰巧處於執行狀態的任何地方停止,因此如果這些線程需要正常終止,則需要使用不同的機制。

執行此操作的一種方法是使用前景線程檢查指示線程關閉的ManualResetEvent對象。在您的OnStop()回調中,設置爲,ManualResetEvent,然後等待線程退出使用Join()。如果他們沒有在合理的時間內退出,你可以強制終止他們,因爲這個過程正在退出。

+0

謝謝,這個作品很棒! – ECC 2015-08-05 15:08:45