none
如何讓 Windows Service 在特定條件下自動關閉? RRS feed

  • 問題

  • 請問我在 Windows Service 應用程式啟動時,如果判斷出系統某些條件不符合時要如何讓此 Windows Service 應用程式自動停止?

    我有嘗試用 this.OnStop(); 讓服務停止,但是在「服務」管理員中還是會看到「已啟動」的狀態,有可能讓服務在「服務管理員」中顯示「已停止」嗎?
    2009年6月8日 下午 12:40

解答

  • 我試出來「優雅」的方式了,還是要靠 ServiceController 來解

    new ServiceController(this.ServiceName).Stop();
    • 已標示為解答 Will_Huang 2009年6月9日 上午 07:33
    2009年6月9日 上午 07:32

所有回覆

  • Will Huang:
       在Service中呼叫了  MyBase.OnStop() <這是VB.NET的語法> 理論上應該會停.我測過是沒有問題.
       至於你在「服務」管理員中還是會看到「已啟動」的狀態 ,恐怕是因為你沒有[重新整理]吧.
       試著在那狀態下,選 [執行]=>[重新整理]
    2009年6月8日 下午 12:58
    版主
  • Bill,

    我試過用 base.OnStop(); 似乎不會讓 SCM (Service Control Manager) 將此服務停止。
    2009年6月8日 下午 03:38
  • 參考

    ServiceBase 類別
    http://msdn.microsoft.com/zh-tw/library/system.serviceprocess.servicebase(VS.80).aspx

    其中

    服務控制管理員 (Service Control Manager,SCM) 提供與服務互動的方式。您可以使用 SCM 傳遞啟動、停止、暫停、繼續或自訂命令給服務。SCM 使用 CanStopCanPauseAndContinue 的值以判斷服務是否接受停止、暫停或繼續的命令。只有當服務類別中對應的屬性 CanStop 或 CanPauseAndContinue 為 true 時,才啟用 SCM 內容功能表中的停止、暫停和繼續。如果已啟用,命令會傳遞至服務,並且呼叫 OnStopOnPauseOnContinue。如果 CanStopCanShutdownCanPauseAndContinuefalse,將不處理對應的命令處理方法 (例如,OnStop),即使您已經實作該方法。

    2009年6月8日 下午 04:21
    版主
  • 我知道 ServiceBase 類別,但要是正在執行中的 Windows Service 程式想要「自我了結」的時候怎麼辦呢?

    我試過用 Environment.Exit(0); 但是在 EventLog 中會出現一筆 Error 訊息,有沒有可能讓他自然優雅的結束呢?
    2009年6月8日 下午 05:25
  • 我們這邊有用一種比較偏門的方法,
    就是讓該 Windows Service 執行一支程式,
    而那支程式的功能就是叫 SCM 把該 Windows Service 給 Stop,
    這樣就可以以正常程序了結。

    No Geek Here! - A blog about DirectShow, Network, and Windows Programming Techniques
    2009年6月9日 上午 12:49
  • 我試出來「優雅」的方式了,還是要靠 ServiceController 來解

    new ServiceController(this.ServiceName).Stop();
    • 已標示為解答 Will_Huang 2009年6月9日 上午 07:33
    2009年6月9日 上午 07:32