2012-07-26 14 views
5

我猜所有執行立即停止,並且調用結束超時。當你停止一項服務時究竟發生了什麼,你對此有多少控制?如果我在處理WCF請求時停止Windows服務,會發生什麼情況?

+1

什麼是Windows服務?這是你寫的東西嗎?這完全取決於服務如何處理關閉請求。它可以被寫爲完成它的當前工作或不完成。 – James 2012-07-26 17:52:33

+0

你自己測試過了嗎?結果是什麼? – Bernard 2012-07-26 17:53:15

+1

我會寫出正確的答案......但老兄......自己測試!只需幾秒鐘即可自行測試。 – Eiver 2012-07-26 18:35:07

回答

4

當服務控制管理器告訴您的服務停止時,.Net服務基礎將狀態設置爲SERVICE_STOP_PENDING並調用服務的OnStop方法。你對這個通知做什麼取決於你。理想情況下,您將擁有一些機制,例如使用CancellationToken通知您當前正在工作的任何線程,以便他們需要將其包裝並儘快退出。在你的情況下,它可能涉及關閉你的ServiceHost。您的OnStop方法應該等到知道它已完成(例如通過加入線程)後再返回。有多種方式可以通知服務控制管理中心您需要更多時間,或者讓其知道您已收到通知,並且正在積極致力於停止(SERVICE_STATUS dwcheckpoint)。

如果您只是立即從您的OnStop返回(或不打擾實施它),那麼我認爲您的服務的線程將全部被強行終止。我不知道,因爲我從來沒有嘗試過。我始終實現OnStop,並且只有在清理完所有內容後才能返回。如果您實現OnStop,但需要很長時間才能返回而不讓服務控制管理器知道您正在處理它,那麼它會稍等一會(服務停止20秒...這是一個註冊表設置),然後終止你的線程。

正確的做法是編寫您的服務,以便快速啓動,快速停止,暫停並繼續快速等等。正如您從上述說明中看到的,完全取決於您的情況服務已經實施。只有你有這些信息才能「確定地知道」。

http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx

相關問題