2013-02-01 91 views
6

我正在尋找一些Windows服務形式的遺留代碼。我注意到,在他們的OnStop()方法中,他們只是寫入事件日誌,但沒有對象清理或終止任何線程的控制。有2個後臺線程在服務啓動時啓動,所以我很想知道,這個服務實際上停止了嗎?而且,如果是這樣,線程是否正確關閉?我必須在Windows服務中實現Stop方法嗎?

停止方法在物理上終止進程還是僅僅是一個邏輯停止,如果沒有實現,實際上並沒有做任何事情?

回答

0

要回答第一個問題它終止過程。 但它必須實現清理代碼,因爲常見的情況是您將線程運行在服務上並停止,但由於線程,進程仍將在那裏。我對左線有相同的經驗,所以我們應該實現線程清理代碼和其他資源,可以防止進程終止。

+0

我剛測試過它(請參閱我的答案中的代碼),它在運行線程時終止了服務而沒有問題。我唯一遇到過的問題就是如果你在'OnStop'中進行了一項需要很長時間才能完成的操作。 –

+0

你的帖子斯科特怎麼了? – jaffa

+0

我再次驗證您的代碼服務將停止,但該過程仍將繼續運行。請停止服務並檢查任務管理器,您將看到該進程存在 –

1

當服務停止時,將調用OnStop()方法,您可以在此清除對象並停止線程等。如果您的線程在停止服務時不需要任何特別的事情,那麼您可以保留OnStop方法

OnStop預計將在派生類中重寫。對於 服務是有用的,和的OnStart調用OnStop都應該在 服務類實現,msdn

+0

如果線程有阻塞調用,如TcpListener偵聽客戶端怎麼辦? – jaffa

+0

OnStop將在不同的線程上調用TcpListener線程如何阻塞它? – Adil

+0

因此OnStop會終止父線程和子線程,而不管子線程是否被阻塞? – jaffa

1

停止服務是不一樣的東西作爲終止它。這是一個邏輯條件。管理員會期望在服務啓動後你會停止做你所做的任何事情。所以你的服務不會阻礙他接下來要做的事情。說備份一個目錄或編輯一個配置文件,等等。

你不要來實際執行此操作。 Windows也沒有強制執行它,服務管理員在您報告說您停止並且不會阻止您執行任何操作時會立即採取措施。但當然可能會讓管理員混淆。

相關問題