我有一個運行多個線程的.NET Windows服務。開發人員添加了一些新線程,但忘記添加代碼以在服務停止之前退出線程。當我停止服務時,它似乎正常停止,但exe服務進程在服務停止後繼續運行幾秒鐘。這段時間發生了什麼,線程會發生什麼?如果Windows服務在停止時未退出線程會發生什麼情況?
回答
如果您不終止線程,但正確處理ServiceStop消息,則其他線程繼續運行約20秒,然後操作系統關閉服務進程,從而殺死線程。
一般來說,似乎沒有任何傷害。
那是那裏很多編輯的一個地獄;)謝謝。這就是我通過觀察收集到的。我想我更想知道爲什麼會有20秒的延遲?當流程退出時,我總是認爲服務經理認爲服務「已停止」,但事實並非如此。它是否會造成傷害取決於線程在被殺時的行爲,不是嗎? – xr280xr
'地獄的很多編輯' - 我的ISP是廢話,我不斷收到錯誤,所以我試圖再次編輯,得到錯誤...我想,20秒的延遲,給服務時間來清理它行爲,如果它需要這樣做。 '傷害',好吧,是的。我試過的唯一的東西是100%CPU循環和睡眠(aLot)循環,作爲測試 - 沒有發生任何不幸事件發生:http://stackoverflow.com/questions/10311750/c-sharp-service-application-to-start -endless線程 –
我假設有延遲,因爲服務往往做的事情被認爲是「更實質的」,而不僅僅是維護用戶的按鈕點擊和擊鍵,例如關閉數據庫連接,斷開網絡連接,停止驅動程序等。事情可能需要幾秒鐘的時間,所以OS會授予一些時間來徹底關閉。但是,最終,操作系統將終止進程,這將終止任何仍在運行的線程。
.NET中的線程可以分爲前臺或後臺線程。如果您詢問的線程可以突然終止而不會對您的服務所做的任何撤消「傷害」,請將它們標記爲background threads,以便它們不阻止終止進程。
- 1. 如果服務停止,後臺線程會發生什麼情況?
- 2. 如果我在處理WCF請求時停止Windows服務,會發生什麼情況?
- 3. Windows服務中的例外情況 - 服務在發生異常時停止
- 4. 如果Web服務更改參數會發生什麼情況?
- 5. 如果正在處理的活套正在退出,會發生什麼情況?
- 6. 未能獲取鎖的線程會發生什麼情況?
- 7. 容器關閉時睡眠線程會發生什麼情況?
- 8. 如果未處理事件會發生什麼情況?
- 9. 如果未捕獲到異常,會發生什麼情況?
- 10. 如果MySQL數據庫未關閉,會發生什麼情況?
- 11. 如果StreamReader或StreamWriter未關閉,會發生什麼情況?
- 12. 如果決策器未運行,會發生什麼情況
- 13. 如果未安裝代碼合同,會發生什麼情況?
- 14. 當發出請求並且客戶端立即退出時,服務器會發生什麼情況?
- 15. Windows服務:如何在工作線程停止時觸發OnStop
- 16. 如果我向未安裝Apache的服務器發出HTTP請求,會發生什麼情況?
- 17. 如果我在asp.net中創建線程,會發生什麼情況?
- 18. 當獲取它的線程退出時,Mutex會發生什麼?
- 19. 如果超時,會發生什麼情況?
- 20. 如果發佈者在收到ack之前終止,會發生什麼情況?
- 21. 工作線程發佈消息時,如果主線程忙,會發生什麼情況?
- 22. 發生病情時會發生什麼情況?
- 23. 如果解析雲數據服務失敗,會發生什麼情況?
- 24. 如果在Application_Start中引發未處理的異常,會發生什麼情況?
- 25. 如果我的程序退出時無法刪除頂點緩衝區對象,會發生什麼情況?
- 26. 如果某個線程死於臨界區域內會發生什麼情況?
- 27. 如果我分離已加入的線程會發生什麼情況?
- 28. 如果從主線程外部調用dispatch_main,會發生什麼情況?
- 29. 當線程在設置鎖定時關閉時會發生什麼情況
- 30. 從while循環中啓動線程,會發生什麼情況?
[如果從主線程返回,進程是否退出?](http://blogs.msdn.com/b/oldnewthing/archive/2010/08/27/10054832.aspx) – GSerg
我不是當然,如果我知道你的意思。我認爲我的OnStop()重寫正在返回。 – xr280xr