我目前正在創建一個演示項目,向團隊的其他成員展示他們如何使用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