在.NET6項目中,不再支持Thread.Abort:Thread.Abort is not supported and throws PlatformNotSupportedException.
原因是Thread.Abort可能導致資源泄漏,
1. 不正常的關閉,導致線程運行過程中待釋放資源的業務代碼,未能完成執行。
2. 異常捕獲,業務模塊未添加捕獲、業務模塊添加了捕獲但finally未執行。這也會引發其它不期望的模塊邏輯異常以及資源釋放問題。
Thread.Abort()
被認爲是一種不安全的方法來終止線程,所以要找下其它的替代方案。
可以通過Dispatcher的BeginInvokeShutdown方法,來關閉UI線程:
1 public static void Close(this Dispatcher dispatcher) 2 { 3 dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal); 4 dispatcher.Thread.Join(); 5 }
調用Shutdown會讓Dispatcher停止處理消息隊列中的操作,並退出Dispatcher.Run消息循環,從而結束UI線程。
Thread.Join()可以等待UI線程結束,以確保Close的同步操作完成時,能滿足調用方立即結束UI線程的期望。