我想正確理解未能觀察到Task在火中使用的例外拋出的后果,并在沒有例外處理的情況下忘記方式。
這是 Jeffry Richter 通過 C# 第三版從 CLR 中摘錄:“[...] 當一個Task物件被垃圾收集時,它的Finalize方法會檢查是否Task遇到了未觀察到的例外;如果有,則Task的Finalize方法拋出 [一個例外]。由于您無法捕獲 CLR 的終結器執行緒拋出的例外,因此您的行程會立即終止。”
我正在撰寫一些測驗代碼以實作終止,但無法導致終止。
使用此處的測驗代碼,我可以看到TaskScheduler.UnobservedTaskException正在呼叫的處理程式。但是,如果我注釋掉事件處理程式訂閱,則例外似乎被吞并并不會導致程式終止。
我已經在版本 4 和 4.8 上使用 .NET Framework 和 Release 版本嘗試過這個。
我如何證明未能觀察到 aTask上拋出的例外確實會導致崩潰?
uj5u.com熱心網友回復:
Jon Skeet 在他對原始帖子的評論中正確識別了這個問題。
我發現的有關此主題的最佳資源是Stephen Toub 提供的。
tldr:“為了讓開發人員更容易撰寫基于任務的異步代碼,.NET 4.5 更改了未觀察到的例外的默認例外行為。雖然未觀察到的例外仍會導致 UnobservedTaskException 事件被引發(不這樣做將是一個破壞性的變化),默認情況下行程不會崩潰。相反,無論事件處理程式是否觀察到例外,例外都會在事件引發后被吃掉。不過,可以配置此行為。新的 CLR 配置標志可能是用于恢復到 .NET 4 的崩潰行為,例如”
<configuration>
<runtime>
<ThrowUnobservedTaskExceptions enabled=”true”/>
</runtime>
</configuration>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/381012.html
上一篇:為什么`React.createElement()`創建一個物件?
下一篇:什么是例外處理程式
