在將流程或可執行文件作爲服務運行時,是否有任何事情需要注意?像靜默日誌這樣的事情。關鍵錯誤報告場景?等等?你如何處理它?將流程作爲Windows服務運行時的最佳做法是什麼?
回答
對於嚴重錯誤報告,您被限制爲使用標準服務設置(在已安裝的服務的屬性中)或自己做某件事。這可能是一個簡單的日誌文件,它記錄了意外的錯誤(通過使用AppDomain.UnhandledException來捕獲並記錄它們),使用Windows事件日誌記錄類似的信息,或讓另一個進程監視服務的錯誤(即服務停止)和提醒某人。
微軟有一篇名爲「Introduction to Windows Service Applications」的文章,這是一篇很好的在.Net中提供服務的通用介紹。
大約從我的經驗開發Windows服務的一些其他的東西:
- Windows服務允許約30秒開始。之後,Windows會報告它沒有正確啓動。這意味着你需要確保你的服務方法啓動一個新的線程來運行服務,然後返回。
- 不要指望任何用戶交互(即消息框,確認),因爲服務運行「無頭」(即沒有UI),所以你不能指望用戶與它交互。
- 檢查服務將運行的帳戶,以確保您沒有將其作爲具有不必要的高安全權限的用戶運行。
- 大量使用日誌記錄(例如log4net),以便您可以在運行時查看服務的功能,以及能夠診斷任何錯誤(通過記錄堆棧跟蹤)。
- 確保使用正確版本的InstallUtil(即32位或64位)來安裝服務。更好的是,讓服務使用ManagedInstallerClass.InstallHelper自行安裝。
所以真的需要一個「合併答案」函數,所以我們都可以是正確的:)。特別是對於這些主觀的「列表」類型問題。 – TheSoftwareJedi 2010-02-17 13:00:50
+1與EE類似,您可以擁有「輔助解決方案」。 – James 2010-02-17 13:54:59
從MSDN頁面引用_This API支持.NET Framework基礎結構,不能直接在您的代碼中使用。因此,實際上是否應該自行安裝該服務? – BanksySan 2015-08-16 13:49:04
不顯示任何消息框/對話框。
請注意,您的應用通常不會以與登錄用戶相同的帳戶運行。因此,如果用戶能夠訪問某個文件/目錄,這並不意味着服務可以做得很好。
確保您有某種形式的警報系統,以便通知您服務是否屬於例如發送電子郵件給自己或某個郵箱。
- 務必使用跟蹤/日誌記錄API來獲取診斷信息。事件日誌,日誌文件,數據庫,無論什麼......只要有疑問解決信息的地方。
- 早期和經常跟蹤/記錄。沒有什麼是更令人沮喪的,因爲必須進行代碼更改才能添加診斷跟蹤。
- 認識到內存泄漏。在編寫每天將重新啓動的應用程序或按計劃任務運行時,有時我們會有點懶惰。記住這個服務需要徹底清理完畢。使用所有IDisposables正確使用using子句。
- 不要忘記揮發性 STOP變量的關鍵字!我的上帝每次都得到我。
+1'我的上帝讓我每次都得到我。' – kenny 2010-02-17 13:01:14
什麼是STOP變量?這聽起來像我應該知道的東西。 – BanksySan 2015-08-16 13:47:42
@BanksySan典型的Windows服務代碼運行在循環中,檢查停止信號的布爾實例變量。 while(!stop){// service code} ...這個停止變量必須標記爲volatile。 – TheSoftwareJedi 2015-09-17 14:59:00
如果有道理,不要忘記實施Pause事件。 處理所有異常,以便在失敗時正常失敗。
我有一個很好的方法,將下面的代碼添加到您的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它會崩潰。
另外 - 在使用服務的同時,我創建了一個工具,它可以幫助我極大地加速開啓和關閉它們 - https://bitbucket.org/mmihajlovic/servicemanager – 2016-04-04 05:17:42
- 1. 運行多個後臺任務的最佳做法是什麼
- 2. 設計SOA WCF Web服務時的最佳做法是什麼?
- 3. 在自動執行服務部署時,設置用戶服務運行的最佳做法是什麼?
- 4. 最佳做法是什麼?
- 5. 圖像服務的最佳做法是什麼?
- 6. Azure虛擬機(Windows)的最佳工作流程是什麼?
- 7. 爲asp.net mvc應用程序託管MS Windows Workflow運行時的最佳做法是什麼?
- 8. 運行python腳本的最佳做法是什麼?
- 9. 運行Hive查詢的最佳做法是什麼
- 10. 停止運行Unicorn服務器進程的最佳方法是什麼?
- 11. 什麼是最佳的計時器間隔? .NET Windows服務
- 12. 總是運行網絡android應用程序的最佳做法是什麼?
- 13. 在Windows 7中運行Linux虛擬服務器的最佳方式是什麼?
- 14. 在用Vim編寫和運行python文件的工作流程中,最佳做法是什麼?
- 15. 將變量值從服務器傳遞給JavaScript的最佳做法是什麼?
- 16. 將XML轉換爲Java對象的最佳做法是什麼?
- 17. log4cxx的最佳做法是什麼?
- 18. 什麼是ViewModel的最佳做法
- 19. PHP - 從遠程服務器獲取ftp列表的最佳做法是什麼?
- 20. 什麼是執行計劃的作業的最佳方式使用Windows服務
- 21. 監控AWS EMR作業運行進度的最佳做法是什麼?
- 22. 將Java應用程序作爲* nix守護程序或Windows服務運行的最佳方法?
- 23. 將Jetty 7作爲Windows服務運行
- 24. 將lighttpd作爲Windows服務運行
- 25. 將WEBrick作爲Windows服務運行
- 26. 將Selenium RC作爲Windows服務運行
- 27. 將Django作爲Windows服務運行
- 28. 將Elastic Search作爲Windows服務運行
- 29. 將.bat作爲Windows服務運行
- 30. 將JAR作爲Windows服務運行
Microsoft對此https://support.microsoft.com/en-us/kb/821794有一篇知識庫文章。 – kiran 2015-10-18 16:08:06