2008-10-01 139 views
16

我正在編寫一系列Windows服務。如果在啓動過程中引發錯誤,我希望它們失敗(在OnStart()方法中)。我曾假設僅僅在OnStart()處發生錯誤就可以做到這一點,但我發現它是「開始」,並向我顯示一條消息,聲明「服務已經啓動,但是不活動,這是正確的嗎?」 (釋義)。我如何處理錯誤,因此實際上無法啓動服務?服務啓動時處理異常

回答

8

如果您運行的是.NET 2.0或更高版本,則可以使用ServiceBase.Stop停止OnStart的服務。否則,請從新線程調用Stop。

參考文獻[devnewsgroups( http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx

(去新聞組)

+0

參考域消失了 – hultqvist 2013-09-11 14:17:08

+0

互聯網檔案救援:https://web.archive.org/web/20070730021813/http://www.devnewsgroups.net/group/microsoft.public.dotnet。 framework/topic50404.aspx – 2014-04-16 17:46:19

7

將所有啓動邏輯移至單獨的方法,並從該單獨方法拋出異常(或調用OnStop)。

OnStart啓動時有一些怪異現象。我發現如果OnStart()中只有一行,那麼我不會得到「服務開始,然後停止。一些服務自動停止,如果他們沒有工作要做」的消息,並拋出異常將終止處理並登錄到應用程序事件日誌。

此外,使用單獨的啓動方法,您可以使用像這樣的技術來調試它,而無需附加。 http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

16

如果你想更主要的是對服務窗口報告說有一個錯誤,從我」已經嘗試過(Windows 7上的.net 3.5),唯一的方法是設置ExitCode。我建議將它設置爲13816,因爲這會導致消息「發生未知錯誤」。見the windows error codes

下面的示例完成了三件事情。 1 - 將ExitCode設置爲最終用戶的有用消息。它不會影響Windows應用程序日誌,但會在系統日誌中包含消息。 2 - 調用停止導致應用程序日誌中的「服務成功停止」消息。 3 - 將異常結果引發到應用程序日誌中的有用日誌條目中。

protected override void OnStart(string[] args) { 

    try { 
    // Start your service 
    } 
    catch (Exception ex) { 
    // Log exception 
    this.ExitCode = 13816; 
    this.Stop(); 
    throw; 
    } 

}