2010-01-27 104 views
3

我有一個從ServiceBase派生的Windows服務類,它使用System.Timers.Timer以頻繁的間隔運行代碼。 OnStopOnPause的處理程序使用一些帶有定時器線程的信號來檢查定時器是否仍在運行並等待它結束。在Windows服務的停止/暫停請求期間處理延遲

在這種情況下,是否有推薦的方式來處理延遲錯誤,例如,如果處理程序正在等待計時器線程停止的無法接受的長時間?

我應該繼續等待,直到SCM放棄爲止(但這會使服務進入一種狀態,除了殺死進程之外,您無法對服務執行任何操作,有時重啓是重啓它的唯一方法)?或者我可能會拋出一個異常(這會使它處於類似的狀態,還是放棄停止/暫停請求)?

我更喜歡它,如果我可以拒絕暫停/停止請求並讓SCM將其保留在用戶可以嘗試暫停/再次停止的狀態。我可以中止計時器線程,但有時它會鎖定在其他資源上,我寧願等待直到完成,並且只有在管理員能夠稍後嘗試停止時記錄錯誤。

回答

1

我對抗SCM放棄了我的頭,導致我的服務像6月在南極洲曬日光浴一樣凍結起來。

對我來說,問題是服務做了一些處理,可能需要的時間可能比SCM願意等待它響應停止請求更長。

我喜歡我的軟件來啓動/退出/暫停,甚至優雅地死亡。

我實現的解決方案是使用配置文件。我把一個ExecutionMode參數放在文件中。在每個處理循環開始時,它檢查配置文件 - 如果ExecutionMode是暫停停止,則它執行代碼來更改狀態並使用SMTP向ServiceChangeNotification參數中列出的電子郵件ID發送電子郵件。電子郵件中包含的詳細信息包括機器名稱,時間戳,服務名稱,舊狀態,舊狀態開始時間,當前狀態,當前狀態開始時間,日誌詳細信息。

2

您可以使用RequestAdditionalTime方法通知SCM您需要更多時間來停止/暫停服務。

+1

我剛剛這樣做,儘管它並沒有完全解決問題,因爲我可能會發現它需要更長和更長的時間,並且只是不斷碰撞時間。優選的解決方案是使其停止。只是嘗試拋出一個異常,它確實做到了這一點。彈出一個未知的錯誤給管理員,但服務仍處於運行狀態(這是準確的),並且管理員仍然可以嘗試稍後停止。不知道它是理想的,但。 – tjmoore 2010-01-27 16:11:57