Dot-Net
如何在服務停止時停止多執行緒 Windows 服務中的工作執行緒
我有一個 Windows 服務,它使用生產者/消費者隊列模型和多個工作執行緒處理隊列外的任務。這些任務可以執行很長時間,如果不是幾小時,也可能是幾分鐘,並且不涉及循環。
我的問題是關於處理服務停止以優雅地結束這些工作執行緒上的處理的最佳方法。我在另一個SO 問題中讀到,使用 thread.Abort() 是糟糕設計的標誌,但似乎服務 OnStop() 方法在服務終止之前只給了有限的時間來完成。我可以在 ThreadAbortException 的擷取中進行足夠的清理(不存在狀態不一致的危險),因此在工作執行緒上呼叫 thread.Abort() 對我來說似乎沒問題。是嗎?有哪些替代方案?
確實,
Abort應該避免。最好給他們一些時間來優雅地退出 - 然後也許在超時後,也許考慮中止它們 - 但最終,服務停止可以通過終止程序來做到這一點。我會嘗試在我的隊列中顯示“刷新並退出”的信號 - 很像這裡
Close的方法,但在完成時會發出某種信號。如果你訴諸
Abort- 考慮致命傷的過程。盡快殺死它。
為“關閉”創建一個任務類型,並為每個工作執行緒將其註入您的生產者/消費者隊列一次。
然後使用 Thread.Join(有超時)來確保關閉已完成。