2009-11-24 60 views
0

我的Windows服務正在使用一個線程(而不是一個定時器),它總是循環,並在每個循環中休眠1秒使用:evet.WaitOne(interval);Windows服務突然沒有做任何事

當我啓動服務時,它工作正常,我可以在任務管理器中看到它正在運行,消耗和釋放內存,消耗處理器...等 這都是正常的,但過了一會兒時間)服務只是停止! 它仍然存在於任務管理器中,但它現在不消耗任何處理器工作,並且其對內存的消耗不變。它只是(死了,但仍然在任務管理器中像殭屍一樣)。我知道在運行服務期間可能發生了很多異常(它確實在做很多事情),但所有這些異常都是在Try catch塊中處理的,所以爲什麼我的「始終循環」線程會停止? 這個線程也記錄每次他循環,當他freezig這樣他沒有記錄任何東西(當然)

+0

也許你可以總結你的服務正在做的任務。網絡訪問,光盤訪問,網絡光盤訪問等...如果您使用的是FileSystemWatcher,這可能是原因(在OnError中重新初始化) – Scoregraphic 2009-11-24 12:15:34

+0

您是否嘗試檢查事件日誌? – Shoban 2009-11-24 12:15:59

+0

謝謝,我檢查了事件日誌,有一個錯誤來自於所謂的東西: NET 2.0運行時錯誤報告 這樣的事情: 事件來源:.NET運行時2。0錯誤報告 事件類別:無 事件ID:1000 我不能調試這一點,因爲我不能準確預料何時會發生這種情況,可能2分鐘或2天后 我搜索了這個錯誤,我有許多不同的答案發生在網絡上,但沒有一個似乎與我目前的問題有關 – 2009-11-24 12:43:28

回答

0

我發現在某個時間有一個異常被拋出,並且該異常打開一個對話框(終止應用程序或取消調試)。 這個對話框很奇怪,因爲我100%肯定我所有的服務代碼都是安全的,並且處理所有的異常。 ,但似乎我從這個服務調用的第三方DLL調用一個不安全的Win32庫,它引發了這個異常(我不知道直到現在,但這是最有可能的,因爲如果我的代碼是導致異常,那麼服務將終止)。

爲了在Windows服務運行時發現這個對話框,我使服務在(本地系統帳戶)下運行,並且選中了框(允許服務與桌面交互),沒有這個我永遠不會看到那個對話框,即使它由被調用的DLL顯示。

感謝所有那些試圖幫助

0

您是否嘗試過使用Thread.Sleep(間隔)而不是等待句柄?

+0

使用Thread.Sleep並不是好習慣,因爲它涉及更多的工作。等待事件 - 像原始海報一樣 - 更好。 – 2009-11-24 12:39:33

+0

不,但我認爲使用evet.WaitOne(區間); 爲服務提供了對任何外部請求作出反應的能力(如停止服務的請求) – 2009-11-24 12:45:07

0

如果您使用.Net 2.0或更高版本,後臺線程中未處理的異常應完全終止該進程。所以情況不太可能如此。

爲了確保正在發生的事情爲您服務,我會建議使用WinDbg,沿線的什麼我前一陣子在說明一個問題what can cause asp.net to stop responding

我建議查明工作者線程和發出一個!CLRStack就可以看到它所持有的東西。如果線程無處可尋,它可能已經崩潰(但是你的主機進程應該已經崩潰了),或者它可能由於某種原因退出。在這種情況下,請使用更加慷慨的日誌記錄。

+0

我會嘗試,但我不知道「alwayes running」線程可以停止!我正在使用: while(true) { } 所以它應該永久循環,如果它崩潰,然後(如你所說)整個服務應該崩潰。 – 2009-11-24 12:48:48

+0

然後它可能停留在等待什麼東西(IO,另一個同步對象,不管)。嘗試附加調試器,或在其上放置windbg。 – 2009-11-24 12:53:40