2010-02-17 31 views

回答

19

對於嚴重錯誤報告,您被限制爲使用標準服務設置(在已安裝的服務的屬性中)或自己做某件事。這可能是一個簡單的日誌文件,它記錄了意外的錯誤(通過使用AppDomain.UnhandledException來捕獲並記錄它們),使用Windows事件日誌記錄類似的信息,或讓另一個進程監視服務的錯誤(即服務停止)和提醒某人。

微軟有一篇名爲「Introduction to Windows Service Applications」的文章,這是一篇很好的在.Net中提供服務的通用介紹。

大約從我的經驗開發Windows服務的一些其他的東西:

  • Windows服務允許約30秒開始。之後,Windows會報告它沒有正確啓動。這意味着你需要確保你的服務方法啓動一個新的線程來運行服務,然後返回。
  • 不要指望任何用戶交互(即消息框,確認),因爲服務運行「無頭」(即沒有UI),所以你不能指望用戶與它交互。
  • 檢查服務將運行的帳戶,以確保您沒有將其作爲具有不必要的高安全權限的用戶運行。
  • 大量使用日誌記錄(例如log4net),以便您可以在運行時查看服務的功能,以及能夠診斷任何錯誤(通過記錄堆棧跟蹤)。
  • 確保使用正確版本的InstallUtil(即32位或64位)來安裝服務。更好的是,讓服務使用ManagedInstallerClass.InstallHelper自行安裝。
+2

所以真的需要一個「合併答案」函數,所以我們都可以是正確的:)。特別是對於這些主觀的「列表」類型問題。 – TheSoftwareJedi 2010-02-17 13:00:50

+0

+1與EE類似,您可以擁有「輔助解決方案」。 – James 2010-02-17 13:54:59

+1

從MSDN頁面引用_This API支持.NET Framework基礎結構,不能直接在您的代碼中使用。因此,實際上是否應該自行安裝該服務? – BanksySan 2015-08-16 13:49:04

3

不顯示任何消息框/對話框。

請注意,您的應用通常不會以與登錄用戶相同的帳戶運行。因此,如果用戶能夠訪問某個文件/目錄,這並不意味着服務可以做得很好。

3

確保您有某種形式的警報系統,以便通知您服務是否屬於例如發送電子郵件給自己或某個郵箱。

14
  • 務必使用跟蹤/日誌記錄API來獲取診斷信息。事件日誌,日誌文件,數據庫,無論什麼......只要有疑問解決信息的地方。
  • 早期和經常跟蹤/記錄。沒有什麼是更令人沮喪的,因爲必須進行代碼更改才能添加診斷跟蹤。
  • 認識到內存泄漏。在編寫每天將重新啓動的應用程序或按計劃任務運行時,有時我們會有點懶惰。記住這個服務需要徹底清理完畢。使用所有IDisposables正確使用using子句。
  • 不要忘記揮發性 STOP變量的關鍵字!我的上帝每次都得到我。
+1

+1'我的上帝讓我每次都得到我。' – kenny 2010-02-17 13:01:14

+1

什麼是STOP變量?這聽起來像我應該知道的東西。 – BanksySan 2015-08-16 13:47:42

+1

@BanksySan典型的Windows服務代碼運行在循環中,檢查停止信號的布爾實例變量。 while(!stop){// service code} ...這個停止變量必須標記爲volatile。 – TheSoftwareJedi 2015-09-17 14:59:00

1

如果有道理,不要忘記實施Pause事件。 處理所有異常,以便在失敗時正常失敗。

3

我有一個很好的方法,將下面的代碼添加到您的OnStart方法中,或者在Main方法中添加更好的代碼。

#if DEBUG 
    //LogMessage("Service starting"); 
    #warning The service has been set to break on debug. Only used for debugging. 

    //LogMessage("DEBUG MODE - If the service crashed after this then your problem is that you're running in DEBUG mode without a Visual Studio installed."); 
    if (Debugger.IsAttached == false) Debugger.Launch(); 
#endif 

基本上重要組成部分,如果Debugger.Launch()當您啓動服務,將彈出一個窗口打開,並詢問您是否要調試的服務,並與Visual Studio的。它使得服務非常簡單。我把#warning放在那裏,所以它顯示在警告列表中,以提醒我它在那裏,但#if DEBUG應該可以防止大多數問題。

只要記住不要在運行此代碼的情況下進行部署(即不要發佈調試代碼),因爲如果計算機上沒有安裝Visual Studio它會崩潰。

+0

另外 - 在使用服務的同時,我創建了一個工具,它可以幫助我極大地加速開啓和關閉它們 - https://bitbucket.org/mmihajlovic/servicemanager – 2016-04-04 05:17:42

相關問題