Я изо всех сил пытаюсь лучше понять логику обработки исключений и ошибок в TPL (и еще немного повезло в задачах async / await .NET 4.5)
Слегка измененный из моего предыдущего вопроса «Как лучше понять код / операторы из статьи« Асинхронный режим - обработка нескольких исключений »?» Код консольного приложения 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
Похоже, что всегда одно и только одно исключение из одной из дочерних задач всегда распространяется / перехватывается.
Почему распространяется / перехватывается только одно исключение?
Я бы лучше понял, если бы ни одно, а точнее, все исключения из дочерних задач всегда перехватывались
Возможно ли в этой ситуации, что оба исключения или ни одно исключение не будут обнаружены?