簡體   English   中英

如何停止具有多個線程的Windows服務無法停止

[英]How to stop a windows service that has multiple threads cannot be stopped

我有一個用C#編寫的Windows服務,該服務創建了多個線程,並且某些線程具有舊代碼,並且我沒有足夠的時間/訪問舊代碼來等待所有這些線程在OnStop()完成之前停止。 再有一次,由於存在遺留代碼,我沒有對所有線程的引用。 現在,我想動態更新服務。 因此,我從Job服務中啟動了一個不同的Updater服務。 Updater服務將停止Job服務,下載Job服務exe和其他dll,將它們替換為舊服務exe和dll,最后將重新啟動Job服務。 啟動后,作業服務將停止更新程序服務。

現在,當Updater服務使用ServiceController.Stop()停止Job服務並調用ServiceController.WaitForStatus(ServiceControllerStatus.Stopped)時,Job服務將停止,但是從Job服務衍生的某些舊線程可能不會在此時停止,並且結果,作業服務exe無法更新。

我真的沒有找到任何好的解決方案。 最好的解決方案是使用WaitHandles(AutoResetEvent / ManualResetEvent)等待所有線程完成,而這沒有發生。 或者可能所有線程都可能被強制中止,這似乎也很關鍵。 另一個不希望的解決方案可能是找到服務進程中正在運行的所有線程,然后終止/終止所有線程,這不是簡單明了,而且也不是首選的解決方案。 我曾希望在OnStop()中使用Environment.Exit,但是發現它導致Windows顯示錯誤的警告消息,提示進程意外終止(錯誤1067),而我根本無法解決。

現在,我感到困惑的是,在短時間內此刻應該做什么而不接觸傳統代碼。 任何幫助將是可觀的。

如果可以使用thread.IsBackground = true啟動線程,則當所有前台線程完成處理時(例如Stop方法),可以自動中斷它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM