我目前正在创建一个演示项目,向团队的其他成员展示他们如何使用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个例外被包含?
我在这里错过了什么?
编辑:@丹布莱恩特把它挂在头上;当我改变的代码如下:
//例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);
}
我得到正确的异常的权数。问题解决了!
有趣。我们来测试一下;如果我将任务分配给列表中的每个元素,然后WaitAll,我应该得到100然后... – Tejs
那么你是正确的! – Tejs