2015-10-01 114 views
1

我有幾個99.9%的時間正確運行的服務。但是,他們使用網絡和數據庫,偶爾會出現一個我沒有預料到的錯誤,使其進入代碼並導致服務崩潰。在這種情況下,重新啓動服務通常會解決問題。重大崩潰後重新啓動服務

我的服務在主代碼運行時創建一個新線程。我已經向服務類添加了錯誤處理,以捕獲並記錄此線程中的任何未處理的異常。我想知道的是,如果我可以調用OnStop,然後從服務類的OnStart重新啓動我的服務?

我使用的代碼與OnStart和OnStop位於同一個類中。我已經發布了它下面:

private void ExceptionHandler(object sender, UnhandledExceptionEventArgs args) 
    { 
     log.Append("Fatal Exception:\n" + args.ExceptionObject); 
     eventLog.WriteEntry(log.ToString()); 
     log = new StringBuilder(); 

     OnStop(); 

     if (numberOfCrashes++ < 10) 
     { 
      Thread.Sleep(60000); 
      OnStart(null); 

      log.Append("The service has been restarted " + numberOfCrashes + " times."); 
      eventLog.WriteEntry(log.ToString()); 
      log = new StringBuilder(); 
     } 
    } 

回答

1

我想知道是,如果我可以從 服務類的OnStart調用調用OnStop,然後重新啓動我的服務?

這將取決於你如何實現您的OnStartOnStop邏輯。

例如,如果您的OnStart能夠確定工作中的thead是否已經啓動,並且如果它停止並再次啓動,那麼是的,您可以通過直接調用這些方法來模擬服務重啓。

因此,在OnStartOnStop實際代碼是正確的回答你的問題,它是由你來重構它來覆蓋你的編程方式,重新啓動您的服務,而無需在操作系統層面重新啓動服務需求。

相關問題