[英]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中,此行為已更改,因此默認情況下會忽略未觀察到的異常。 您可以設置一個配置開關,以重新啟用舊的嚴格行為。
因為使用Task就像使用單獨執行的線程(主線程除外)一樣。 因此,通過這種方式,您可以使Loop輸出與GC.Collect一起執行,直到Task執行異常行為止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.