我有一個Task
異步運行,並使用任務延續task.ContinueWith(t => ..., CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, taskScheduler)
處理異常。是否有可能從任務延續觸發AppDomain的未處理異常處理程序失敗?
這對於處理我知道如何處理的異常(例如WebException
)非常適用,但如果拋出類似NullReferenceException
的東西,我無法正確處理?
我希望能夠使用AppDomain的未處理的異常處理程序(在我們的例子中記錄錯誤,彈出一個對話框通知用戶,並退出應用程序)處理它,但到目前爲止我還沒有找到一個好這樣做的方法。
簡單地從繼續中重新拋出異常會導致在任務完成時調用未處理的異常處理程序(因爲重新拋出的異常未被發現)。這是不好的,因爲我知道應用程序崩潰後可能是幾秒鐘甚至幾分鐘。
調用Environment.FailFast()
會使應用程序崩潰,但不會調用未處理的異常處理程序。
調用Thread.CurrentThread.Abort()
調用未處理的異常處理程序,但僅顯示來自ThreadAbortException
的信息/堆棧跟蹤。另外,使用這種方法似乎是個不錯的主意。
調用Application.OnThreadException()
實際上正是我想要的,除了它需要參考System.Windows.Forms
和處理Application.ThreadException
,它不適用於例如沒有UI的服務。
調用task.Wait()
沒有意義,因爲在我們的情況下,沒有地方可以調用它。如果任務成功,則使用成功繼續來處理結果,如果失敗,則調用異常繼續,並且不能阻塞創建任務的線程(這是任務的整個點)。
我可以直接調用未處理的異常處理程序,但至少有一種情況需要添加我不想在我的應用程序中添加的依賴項。
我錯過了一個明顯的方法來做到這一點?
是的,這使它遠離我的工具箱。你有沒有想過如何調用Dispose()方法呢? –