簡體   English   中英

為什么任務異常不會在GC.Collect上重新拋出

[英]Why task exception not rethrown on GC.Collect

我的理解是,當Task引發異常時,將在觀察Tasks的(Result,WaitAll)屬性之一或發生GC時將其存儲並重新拋出。 鑒於此,我運行以下代碼。

Task t = Task.Factory.StartNew(() =>
{                    
    throw new Exception("Hello World");
});

for (int i = 0; i < 10000; i++)
{
    Console.WriteLine(i);
}    

 GC.Collect();

 for (int a = 20; a < 30; a++)
 {
      Console.WriteLine(a);
 }

但是,當我運行上面的代碼時,除了要在GC.Collect上引發的異常外,我沒有發生這種異常,而是繼續從第二個循環打印輸出。 我的理解哪里錯了?

在您的示例代碼中, Task對象t仍然在作用域內,因此在調用GC.Collect()時不符合收集條件的條件。

除此之外,.NET 4.0和.NET 4.5之間的行為發生了變化:

在.NET 4.0中,未觀察到的異常將在終結器線程上引發異常,從而導致進程崩潰。

在.NET 4.5中,此行為已更改,因此默認情況下會忽略未觀察到的異常。 您可以設置一個配置開關,以重新啟用舊的嚴格行為。

.NET 4.0:任務和未處理的異常

.NET 4.5:.NET 4.5中的任務異常處理

因為使用Task就像使用單獨執行的線程(主線程除外)一樣。 因此,通過這種方式,您可以使Loop輸出與GC.Collect一起執行,直到Task執行異常行為止。

暫無
暫無

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

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