gpt4 book ai didi

c# - 为什么不在 GC.Collect 上重新抛出任务异常

转载 作者:太空狗 更新时间:2023-10-29 23:16:28 25 4
gpt4 key购买 nike

我的理解是,当 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: Tasks and Unhandled Exceptions

.NET 4.5: Task Exception Handling in .NET 4.5

关于c# - 为什么不在 GC.Collect 上重新抛出任务异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12883758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com