在.net 4.0中说,任务中未处理的异常将使应用程序在最终确定时被破坏。 (在.net 4.5中也有人说过,MS编辑了异常规则,即未处理的异常不会被抛出)。
但我尝试下面的代码,看看应用程序。 (在.net4.0中),但看起来很强大。
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
var t = Task.Factory.StartNew<int>(() => { throw new Exception("xxxxxx"); return 1; }
, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
}
while (true)
{
GC.Collect();
Thread.Sleep(1000);
}
Console.ReadKey();
}
代码运行GC.Collect()来完成Task对象,但应用程序没问题。它没有被打破。
为什么呢?
答案 0 :(得分:1)
如果您的计算机上安装了.net 4.5,则会对.net 4.0进行原位修改,这可能就是您获得所见行为的原因。
如果您希望仍然抛出未观察到的异常,可以将以下部分添加到配置文件中:
<configuration>
<runtime>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>
</configuration>