Roy*_*mir 1 c# .net-4.0 task task-parallel-library
如果我有一个抛出异常的任务,我可以检查继续是否有异常:
Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write (ant.Exception));
Run Code Online (Sandbox Code Playgroud)
但我也知道:
如果先行者抛出并且延续未能查询前件的Exception属性(并且未等待前提),则该异常被视为未处理且 应用程序死亡.
所以我尝试过:
Task task1 = Task.Factory.StartNew (() => { throw null; });
Task task2 = task1.ContinueWith (ant => Console.Write (1));//1
Run Code Online (Sandbox Code Playgroud)
但应用程序没有崩溃.
拜托,我错过了什么?
几乎没有什么不同的事情发生:
首先,如果你调用Wait()一个断陷Task,它会永远抛出一个异常,不管你已经注意到这一点.在您的代码中,这意味着如果您task.Wait()从中调用Main(),整个应用程序将崩溃,因为您有未处理的异常Main().
其次,.Net 4.5 中未处理的异常行为Task发生了变化,它们将不再导致应用程序崩溃.本文还介绍了如何切换回原始行为.如果安装了.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();
}
Run Code Online (Sandbox Code Playgroud)
您的代码没有崩溃,因为GC在应用程序正常退出之前没有机会运行.
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |