2013-01-09 35 views
2

我有一個運行多個線程的.NET Windows服務。開發人員添加了一些新線程,但忘記添加代碼以在服務停止之前退出線程。當我停止服務時,它似乎正常停止,但exe服務進程在服務停止後繼續運行幾秒鐘。這段時間發生了什麼,線程會發生什麼?如果Windows服務在停止時未退出線程會發生什麼情況?

+0

[如果從主線程返回,進程是否退出?](http://blogs.msdn.com/b/oldnewthing/archive/2010/08/27/10054832.aspx) – GSerg

+0

我不是當然,如果我知道你的意思。我認爲我的OnStop()重寫正在返回。 – xr280xr

回答

1

如果您不終止線程,但正確處理ServiceStop消息,則其他線程繼續運行約20秒,然後操作系統關閉服務進程,從而殺死線程。

一般來說,似乎沒有任何傷害。

+0

那是那裏很多編輯的一個地獄;)謝謝。這就是我通過觀察收集到的。我想我更想知道爲什麼會有20秒的延遲?當流程退出時,我總是認爲服務經理認爲服務「已停止」,但事實並非如此。它是否會造成傷害取決於線程在被殺時的行爲,不是嗎? – xr280xr

+0

'地獄的很多編輯' - 我的ISP是廢話,我不斷收到錯誤,所以我試圖再次編輯,得到錯誤...我想,20秒的延遲,給服務時間來清理它行爲,如果它需要這樣做。 '傷害',好吧,是的。我試過的唯一的東西是100%CPU循環和睡眠(aLot)循環,作爲測試 - 沒有發生任何不幸事件發生:http://stackoverflow.com/questions/10311750/c-sharp-service-application-to-start -endless線程 –

2

我假設有延遲,因爲服務往往做的事情被認爲是「更實質的」,而不僅僅是維護用戶的按鈕點擊和擊鍵,例如關閉數據庫連接,斷開網絡連接,停止驅動程序等。事情可能需要幾秒鐘的時間,所以OS會授予一些時間來徹底關閉。但是,最終,操作系統將終止進程,這將終止任何仍在運行的線程。

.NET中的線程可以分爲前臺或後臺線程。如果您詢問的線程可以突然終止而不會對您的服務所做的任何撤消「傷害」,請將它們標記爲background threads,以便它們不阻止終止進程。

相關問題