2013-02-25 163 views
0

我寫了一個自動啓動並且狀態變爲「開始」的窗口服務。有時服務狀態會進入「開始」狀態,即使重新啓動系統後也無法恢復到「已啓動」狀態。它可能是由於代碼中的某些未處理的異常而發生的。Windows服務狀態「開始」

public partial class EngineHostService : ServiceBase 
{ 
    internal static ServiceHost _serviceHost = null; 

    public EngineHostService() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     try 
     { 
      if (_serviceHost != null) 
       _serviceHost.Close(); 

      _serviceHost = new ServiceHost(typeof(EngineService.Engine)); 
      _serviceHost.Open(); 
     } 
     catch (Exception ex) 
     { 
      ErrorHandler.LogEvent(ex.Message); 
     } 
    } 

    protected override void OnStop() 
    { 
     if (_serviceHost != null) 
     { 
      _serviceHost.Close(); 
      _serviceHost = null; 
     } 
    } 

} 

在上面的代碼中,Engine類的構造函數執行時,會引發一些異常。 我想停止服務:1-如果拋出一些異常。 2-如果我在構造函數中調用的任何函數返回false。 有什麼方法可以根據需要停止服務。如果我願意,我肯定會將服務狀態視爲「已啓動」或「已停止」。建議某種方式。

回答

0

單獨的問題。 你應該儘可能快地從OnStart返回,所以我建議在你的OnStart方法中啓動一個異步TPL任務,並且不要做任何事情。

在異步任務中,你可以做任何你想做的事情。

通過這樣做,您的服務將能夠完成OnStart並從正確的開始移動到開始。

+0

」在異步任務中,你可以做任何你想做的事 通過這樣做你的服務將能夠完成OnStart並從正確的開始移動到開始。這是好的... 但是我想停止從異步線程的服務,如果某個函數返回false或者有任何異常(處理或未處理)拋出。 – himanshu 2013-02-25 08:34:12

0

聽起來好像InitializeComponent正在做太多的工作,或者EngineService.Engine這是啓動。坦率地說,你應該在啓動時直接做很少的事情:驗證配置,然後爲真正的工作啓動一個工作者線程(或幾個)。

0

服務控制管理器希望OnStart在30秒內完成。 如果啓動需要更多時間,請通過RequestAdditionalTime(60 * 1000)通知SCM; 如果OnStart耗時過長,SCM將提示'無法啓動服務'。 當OnStart完成您的服務時務必準備好接受服務請求。

注意: 不要使用構造函數來執行應該在OnStart中的處理。使用OnStart處理所有服務的初始化。構造函數在應用程序的可執行文件運行時調用,而不是在服務運行時調用。 「