gpt4 book ai didi

c# - Tpl 的延续和异常(exception)?

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:38 25 4
gpt4 key购买 nike

如果我有一个抛出异常的任务,我可以检查是否有异常的延续:

Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write (ant.Exception));

但我也知道:

If an antecedent throws and the continuation fails to query the antecedent’s Exception property (and the antecedent isn’t otherwise waited upon), the exception is considered unhandled and the application dies .

所以我试过了:

Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write (1));//1

但应用程序没有崩溃。

拜托,我错过了什么?

最佳答案

发生了一些不同的事情:

首先,如果您在有故障的 Task 上调用 Wait(),它会总是抛出异常,无论您是否已经观察到它与否。在您的代码中,这意味着如果您从 Main() 调用 task.Wait(),整个应用程序将崩溃,因为您在 Main 中有未处理的异常()

第二,the behavior of unhandled exceptions in Tasks changed in .Net 4.5并且它们将不再导致应用程序崩溃。本文还介绍了如何切换回原始行为。如果您安装了 .Net 4.5,这也适用于以 .Net 4.0 为目标的应用程序(例如,使用 VS 2010 构建的应用程序)。

第三,对于 .net 4.0 行为,当 Task 被垃圾回收时应用程序崩溃 (假设在那之前没有观察到异常)。这是因为在此之前,您的代码仍有机会观察到该异常。

因此,以下代码会使应用程序崩溃(假设您在安装了 .Net 4.5 的情况下启用了 .Net 4.0 行为):

static void Main()
{
Task.Factory.StartNew(() => { throw new Exception(); });

// give the Task some time to run
Thread.Sleep(100);

GC.Collect();
}

您的代码没有崩溃,因为 GC 在应用程序正常退出之前没有机会运行。

关于c# - Tpl 的延续和异常(exception)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15042975/

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