2009-02-24 60 views
0

我有一個Windows服務,有一個計時器,每30秒觸發一個方法。Windows服務停止工作,回收修復它

該方法然後調用thread.sleep(),當它完成時調用thread.start();

除了調用胎面睡眠/啓動的調用外,方法中的所有代碼都封裝在try/catch中。

出於某種原因,該服務停止工作,但如果我回收它或將其設置在崩潰回收它工作正常。

我該如何診斷問題?
是否還有像OnCrash或somethign這樣的其他事件可以嵌入到堆棧跟蹤中?

回答

0

windows服務與普通應用程序一樣,只是執行方式不同而已。所以問問你自己,如果你的正常應用程序沒有崩潰,但停止工作可能會導致它?很多東西都會引起注意,像鎖定問題,併發問題等等......

雖然沒有OnCrash事件,但是我爲Windows服務所做的工作是將所有邏輯放在一個單獨的程序集中,並使用簡單的啓動方法,可以將其託管在控制檯應用程序中並輕鬆進行測試,並且轉移到Windows服務也不會太難。

你的另一個選擇是attach the Visual Studio debugger to the Windows service和調試正常。

0

沒有,沒有,但爲什麼不只是把一個try/catch自己,當它發生時記錄異常?

另外,我發現呼叫睡眠和開始非常可疑。一般來說,您不應該使用這些調用進行同步。你爲什麼要打這些電話?

+0

只是爲了確保我呼籲每一個經過的事件犯規」最後不再那麼下次調用經過的事件的方法。 – Blankman 2009-02-24 14:48:14

+0

@Blankman:那麼基本上,如果有另一個事件進入,你就是在殺死方法的執行?我認爲這是一個壞主意。我認爲你應該考慮一個生產者/消費者隊列,你會處理每30秒的所有元素。 – casperOne 2009-02-24 16:15:39

0

我認爲首先你需要找到它崩潰的原因。 OnCrash?好吧,如果它墜毀,我不會說太多的話。

0

其計時器!。 擺脫它,你的問題將得到解決。

檢查此post欲知更多信息。

你最好做這樣的操作...

While (stopSignal = False) 
'do your work' 
Thread.Sleep(yourInterval) 
End While 

編輯:如果你想調試服務,而不必通過附加一個調試器來受苦,然後做this

無論你是否同意這一點,MS已確認它的一個bug,並刪除計時器是避免此問題的唯一方法。如果可以提供幫助,您也不應該將異常用作程序流控制(Catch and Retry)。