我有一個Windows服務,有一個計時器,每30秒觸發一個方法。Windows服務停止工作,回收修復它
該方法然後調用thread.sleep(),當它完成時調用thread.start();
除了調用胎面睡眠/啓動的調用外,方法中的所有代碼都封裝在try/catch中。
出於某種原因,該服務停止工作,但如果我回收它或將其設置在崩潰回收它工作正常。
我該如何診斷問題?
是否還有像OnCrash或somethign這樣的其他事件可以嵌入到堆棧跟蹤中?
我有一個Windows服務,有一個計時器,每30秒觸發一個方法。Windows服務停止工作,回收修復它
該方法然後調用thread.sleep(),當它完成時調用thread.start();
除了調用胎面睡眠/啓動的調用外,方法中的所有代碼都封裝在try/catch中。
出於某種原因,該服務停止工作,但如果我回收它或將其設置在崩潰回收它工作正常。
我該如何診斷問題?
是否還有像OnCrash或somethign這樣的其他事件可以嵌入到堆棧跟蹤中?
windows服務與普通應用程序一樣,只是執行方式不同而已。所以問問你自己,如果你的正常應用程序沒有崩潰,但停止工作可能會導致它?很多東西都會引起注意,像鎖定問題,併發問題等等......
雖然沒有OnCrash事件,但是我爲Windows服務所做的工作是將所有邏輯放在一個單獨的程序集中,並使用簡單的啓動方法,可以將其託管在控制檯應用程序中並輕鬆進行測試,並且轉移到Windows服務也不會太難。
你的另一個選擇是attach the Visual Studio debugger to the Windows service和調試正常。
沒有,沒有,但爲什麼不只是把一個try/catch自己,當它發生時記錄異常?
另外,我發現呼叫睡眠和開始非常可疑。一般來說,您不應該使用這些調用進行同步。你爲什麼要打這些電話?
我認爲首先你需要找到它崩潰的原因。 OnCrash?好吧,如果它墜毀,我不會說太多的話。
您可以使用Microsoft的Debug Diagnostic Tool v1.1來監視服務並在崩潰時創建轉儲。然後你可以調試轉儲。
只是爲了確保我呼籲每一個經過的事件犯規」最後不再那麼下次調用經過的事件的方法。 – Blankman 2009-02-24 14:48:14
@Blankman:那麼基本上,如果有另一個事件進入,你就是在殺死方法的執行?我認爲這是一個壞主意。我認爲你應該考慮一個生產者/消費者隊列,你會處理每30秒的所有元素。 – casperOne 2009-02-24 16:15:39