В настоящее время я создаю демонстрационный проект, чтобы показать остальным членам моей команды, как они могут использовать 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 Брайант ниже прикрепил его на голову;когда я изменяю код на следующее:
// Пример 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);
}
Я правильно получаю правильное количество исключений.Проблема решена!