簡體   English   中英

如何在未處理的任務異常上崩潰?

[英]How to crash on unhandled Task exception?

我想正確理解未能觀察到在火災中使用的Task上引發的異常的后果,並且在沒有異常處理的情況下忘記了方式。

這是 Jeffry Richter 通過 C# 第三版從 CLR 中摘錄的內容:“[...] 當一個Task object 被垃圾收集時,它的Finalize方法檢查Task是否經歷了未觀察到的異常;如果有, TaskFinalize方法拋出[異常]。由於您無法捕獲 CLR 的終結器線程拋出的異常,因此您的進程將立即終止。

我正在編寫一些測試代碼來導致終止,但無法導致終止。

使用此處的測試代碼,我可以看到TaskScheduler.UnobservedTaskException處理程序被調用。 但是,如果我注釋掉事件處理程序訂閱,異常似乎被吞沒了,不會導致程序終止。

我已經在版本 4 和 4.8 上使用 .NET 框架和發布版本進行了嘗試。

我如何證明未能觀察到Task引發的異常確實會導致崩潰?

我找到的關於這個主題的最佳資源是Stephen Toub的。

tldr:“為了讓開發人員更輕松地編寫基於任務的異步代碼,.NET 4.5 更改了未觀察到的異常的默認異常行為。雖然未觀察到的異常仍會導致引發 UnobservedTaskException 事件(不這樣做將是一個重大更改) , 默認情況下進程不會崩潰。相反,無論事件處理程序是否觀察到異常,異常最終都會在事件引發后被吃掉。不過,可以配置此行為。可以使用新的 CLR 配置標志恢復到 .NET 4 的崩潰行為,例如“

<configuration>
    <runtime>
        <ThrowUnobservedTaskExceptions enabled=”true”/>
    </runtime>
</configuration>

暫無
暫無

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

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