2010-07-22 181 views
0

我有此代碼重新啓動服務,但這不起作用。無法重新啓動服務

我可以單獨啓動和停止,但不會重新啓動,這涉及我首先停止並啓動服務。

try 
{ 
    //service.Stop(); 
    //service.Start(); 
    int millisec1 = Environment.TickCount; 
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 

    service.Stop(); 
    service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 

    // count the rest of the timeout 
    int millisec2 = Environment.TickCount; 
    timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1)); 

    service.Start(); 
    service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
} 
catch 
{ 
    // ... 
} 

它只是在catch部分。

我不知道我錯在哪裏。

有什麼建議。

UPDATE:

所以我把這個想法從下面的正確答案:

這是需要做>

public static void RestartService(string serviceName, int timeoutMilliseconds) 
{ 
    ServiceController service = new ServiceController(serviceName); 

    int millisec1 = Environment.TickCount; 
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
    if (!(service.Status.Equals(ServiceControllerStatus.Stopped) || service.Status.Equals(ServiceControllerStatus.StopPending))) 
    { 
     service.Stop(); 
     service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
    } 
    // count the rest of the timeout 
    int millisec2 = Environment.TickCount; 
    timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1)); 

    if (!(service.Status.Equals(ServiceControllerStatus.Running) || service.Status.Equals(ServiceControllerStatus.StartPending))) 
    { 
     service.Start(); 
     service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
    } 
} 
+4

變化'catch'到'趕上(異常前)'和異常保存到一個日誌文件或Windows事件日誌。然後請發佈該例外的文本,我們將能夠排除實際發生錯誤的問題。就目前而言,唯一可以提出的建議是「發生例外。」 – 2010-07-22 14:38:02

+2

也許你應該閱讀引發的異常,而不是壓制它。可能是一個幫助。 ; o) – DHN 2010-07-22 14:38:15

+0

你看到什麼異常?您應該捕獲一些異常,以便您可以獲取並記錄消息。 – 2010-07-22 14:38:19

回答

5

有一個空的catch塊捕獲所有異常是很少一個好主意,因爲嚴重的問題很容易通過。

修改你的代碼,至少在catch塊中做一些日誌記錄,例如

catch (Exception ex) 
{ 
    System.Diagnostics.Trace.WriteLine(ex.ToString()); 
} 

然後,您可以附加一個跟蹤偵聽器在服務的構造函數或使用Sysinternals公司的DebugView工具讀取跟蹤消息。如果您想更進一步,您可能需要將log4net之類的日誌記錄庫包含到您的項目中。

我的猜測是你得到一個TimeoutException,因爲停止服務需要更長的時間,如你所料。您是否嘗試通過刪除超時參數來增加超時或無限等待?

更新:

你可能需要檢查你的服務是否啓動與否:

if (!(service.Status.Equals(ServiceControllerStatus.Stopped) 
     || service.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    service.Stop(); 
} 
service.Start(); 
+0

所以server.Stop不起作用。我得到錯誤:「該服務尚未啓動」 堆棧跟蹤它顯示:「[Win32Exception(0x80004005):服務尚未啓動] [InvalidOperationException:無法停止計算機上的XYZService服務'。'。 ] System.ServiceProcess.ServiceController。Stop()+410「 – user175084 2010-07-22 15:00:43

+0

因此,在上面的代碼中發生的是,如果條件爲真,它會停止服務並執行回發,因此不會執行service.Start()。因此服務停止但不會 – user175084 2010-07-22 15:21:25

+0

@ user175084:「postback」是什麼意思?上面的示例代碼會停止服務,如果它* *不在* Stopped *或* StopPending *狀態,那麼它將啓動服務 – 2010-07-22 15:41:19