2009-04-12 192 views
1

夥計們,長時間運行Windows服務

我想開發一個長期運行的Windows服務(它應該毫無問題地工作了幾個月),我不知道什麼是更好的選擇在這裏:

  1. 使用OnStop方法中的一段時間(真)循環
  2. 使用計時器每隔n秒鐘打勾並觸發我的代碼
  3. 任何其他選項?

感謝 埃薩姆

回答

6

我不會做#1。

我要麼做#2,要麼在OnStart中分離出一個單獨的線程來完成實際的工作。

6

只要不是#1
服務管理器(或用戶,如果他是一個激活控件)預計OnStart()OnStop()到及時返回。
通常的做法是開始自己的線程,使事情保持運行,並聽取可能告訴它停止的事件。

+0

單獨線程方式的+1 - 這是要走的路! – 2009-04-12 18:06:34

1

我不會推薦#1。

我在過去爲完全相同的場景/情況所做的事情是創建一個計劃任務,運行N秒鐘,啓動一個小腳本,只是做這兩件事:#1檢查「IsAlreadyRunning」標誌(從數據庫中讀取)#2如果標誌爲真,那麼腳本立即停止結束出口。如果該標誌爲false,則腳本在新線程中啓動一個單獨的進程(exe)(使用服務執行可能非常短或有時非常長的任務,具體取決於要處理的記錄量)。這個過程當然會設置並重置IsAlreadyRunning標誌,以確保線程不會觸發重疊的操作。我有一種多年來一直使用這種方法運行的服務,我從來沒有遇到任何問題。我的主要過程利用Web服務和其他一些東西來執行一些重要的備份操作。

0

難道做一個

1清理任務,或

2醒來,看看是否需要運行任務

如果是像#2,然後使用MSMQ會更合適。 MSMQ任務幾乎可以立即完成。

2

不要搞亂服務控制器代碼。如果該服務想要停止,您只會使用#1使事情變得更糟。順便說一句,服務可以總是崩潰,在這種情況下,你的while(true)不會幫你一件事情。

如果你真的想擁有一個「運行Windows服務(它應該毫無問題地工作了好幾個月)」,你最好確保自己的代碼是正確徹底使用單元測試和集成測試測試之前你運行它作爲一項服務。

相關問題