【发布时间】:2011-08-17 23:36:47
【问题描述】:
我目前正在创建一个演示项目,向我的团队的其他成员展示他们如何使用 TPL 来编写更好的代码。但是,我对一个我认为应该以另一种方式运作的问题感到困惑。代码:
// Example 7 - Even more exceptions
try
{
var numberList = Enumerable.Range(0, 1000).AsParallel().Select(x =>
{
if (x % 2 == 0)
throw new ApplicationException("Shazam!");
return x;
}).ToList();
}
catch (AggregateException e)
{
int exceptionsAggregated = 0;
e.Flatten().Handle(ex =>
{
if (ex is ApplicationException)
{
if ((ex as ApplicationException).Message == "Shazam!")
exceptionsAggregated++;
}
return true;
});
Console.WriteLine("Exceptions: " + exceptionsAggregated);
}
除了发生的情况外,聚合异常将包含 500 个内部异常,因为在 PLINQ 中调用的每个其他线程都会引发异常。但是,我在聚合异常中只得到 4 个异常。
我的第一个想法是,当 TPL 达到可以抛出的异常数量的限制时,它可能会终止运行。但是,我似乎找不到任何支持该主张的在线文章或文档。所以我在这里有点难过;什么会导致只包含 4 个异常?
我只是在这里遗漏了一些基本的东西吗?
编辑:下面的@Dan Bryant 把它钉在了头上;当我将代码更改为以下内容时:
// 示例 7 - 更多异常
try
{
var tasks = Enumerable.Range(0, 100).Select(x => Task.Factory.StartNew(() =>
{
if (x % 2 == 0)
throw new ApplicationException("Shazam!");
return x;
})).ToArray();
Task.WaitAll(tasks);
}
catch (AggregateException e)
{
int exceptionsAggregated = 0;
e.Flatten().Handle(ex =>
{
if (ex is ApplicationException)
{
if ((ex as ApplicationException).Message == "Shazam!")
exceptionsAggregated++;
}
return true;
});
Console.WriteLine("Exceptions: " + exceptionsAggregated);
}
我正确地得到了正确数量的异常。问题解决了!
【问题讨论】:
标签: c# exception console-application task-parallel-library