Почему всегда распространяется только одно из многих исключений из дочерних задач?
Я изо всех сил пытаюсь лучше понять причину исключений и обработки ошибок в TPL (и с еще большей удачей в .NET 4.5 асинхронных / ожидающих задач)
Немного модифицированный из моего предыдущего вопросаКак лучше понять код / операторы изAsync - обработка нескольких исключений " статья?" Код консольного приложения C #, работающий 2отдельный внутренний вложенный прикрепленный (зависимый) ребенок (обновление: извините, один вопрос начался, а другой закончился!):
class Program
{
static void Main(string[] args)
{ Tst();
Console.ReadLine();
}
async static Task Tst()
{
try
{
await Task.Factory.StartNew
(() =>
{
Task.Factory.StartNew
( () => {
Console.WriteLine("From 1st child");
throw new NullReferenceException();
}
, TaskCreationOptions.AttachedToParent
);
Task.Factory.StartNew
( () =>
{
Console.WriteLine("From 2nd child");
throw new ArgumentException();
}
,TaskCreationOptions.AttachedToParent
);
}
);
}
catch (AggregateException ex)
{
Console.WriteLine("** {0} **", ex.GetType().Name);
foreach (var exc in ex.Flatten().InnerExceptions)
{
Console.WriteLine(exc.GetType().Name);
}
}
catch (Exception ex)
{
Console.WriteLine("## {0} ##", ex.GetType().Name);
}
}
производит выходные данные, которые чередуются (недетерминированно) между:
From 1st child
From 2nd child
** AggregateException **
ArgumentException
а также
From 1t child
From 2nd child
** AggregateException **
NullReferenceException
Похоже, что всегда одно и только одно исключение из одной из дочерних задач всегда распространяется / перехватывается.
Почему распространяется / ловится только одно исключение?
я бы лучше понял, если бы не вылавливались все или почти все исключения из дочерних задач
Возможно ли в этой ситуации, что оба или ни одно исключение будут пойманы?