2013-04-11 47 views
3

我需要我的服務來檢查某些文件在其啓動過程中是否存在以及某些文件的結構,如果沒有滿足某些條件,請退出/失敗/停止。 我看了這個帖子:What is the proper way for a Windows service to fail? 但它沒有幫助。Windows服務在啓動過程中失敗的正確方法是什麼

我將ServiceBase.ExitCode屬性設置爲非零值,然後調用ServiceBase.Stop。但我得到5個事件日誌條目。如下所示:

Starting service. (I log this event via code) 
Config.xml file not found. (I log this ERROR event via code) 
Service stopped successfully. (SCM logs this message) 
Service started successfully. (SCM logs this message) 
Service cannot be started. The handle is invalid (SCM logs this message) 

正如您所看到的一切都很好,除了最後兩個條目。他們爲什麼在那裏?如何在啓動過程中正確關閉服務?爲什麼SCM沒有將服務視爲停止/失敗?

+0

我發現扔的不是調用停止()防止被調用的調用OnStop事件例外,我懷疑贏記錄你所看到的「已成功停止」的信息。到目前爲止我唯一能找到的似乎是可能的退出代碼列表是http://www.hiteksoftware.com/mize/Knowledge/articles/049.htm。如果我使用不在列表中的退出代碼,則會收到類似[「Error 10501:0x2905」](http://i.imgur.com/UohWLVr.png)(x2905 =十進制值10501)的消息。關於退出代碼是否沒有MSDN文檔,或者有關如何向用戶發出如何調試問題的指導? – gregmac 2013-07-19 19:36:07

回答

1

您沒有提供足夠的代碼來真正知道,但我懷疑您正在嘗試驗證服務並在構造函數或OnStart中停止它。我喜歡處理服​​務的方式是在OnStart中啓動我的計時器。在定時器的第一個時間間隔中,我可以驗證所有代碼,如果它無效關閉服務。如果它有效,將定時器的間隔重置爲我希望它運行的頻率,然後設置一個布爾值,告訴它不要再次檢查文件的有效性。

0

您爲ExitCode使用的退貨代碼是什麼?如果它與相應的窗口ExitCode相匹配,那麼SCM將記錄該內容。我假設你爲ExitCode返回6。

另一件事是,如果你可以在默認值上運行,那麼讓Config.xml丟失,並在EventLog中記錄問題。 「配置文件丟失」

如果你真的希望它在OnStart只是中止,設置你的ExitCode,然後拋出一個異常(InvalidArgumentExceptionInvalidOperationException)例如

這篇文章也有一些很好的建議。 .NET: Which Exception to Throw When a Required Configuration Setting is Missing?

0

您正在嘗試啓動服務的第二個實例(同一.EXE註冊另一個服務)

相關問題