К сожалению, этот пример никогда не покажет вам ваш код.UnobservedTaskException
произойдет только в том случае, если задача собрана GC, за исключением незамеченного исключения - до тех пор, пока вы удерживаете ссылку на task1
и task2
, GC никогда не соберет и вы никогда не увидите свое исключение.обработчик.
Чтобы увидеть поведение UnobservedTaskException
в действии, я бы попробовал следующее (надуманный пример):
public static void Main()
{
TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
eventArgs.SetObserved();
((AggregateException)eventArgs.Exception).Handle(ex =>
{
Console.WriteLine("Exception type: {0}", ex.GetType());
return true;
});
};
Task.Factory.StartNew(() =>
{
throw new ArgumentNullException();
});
Task.Factory.StartNew(() =>
{
throw new ArgumentOutOfRangeException();
});
Thread.Sleep(100);
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Done");
Console.ReadKey();
}
Это покажет вам ваши сообщения.Первый вызов Thread.Sleep(100)
предоставляет достаточно времени для выполнения задач.Сбор и ожидание вынуждают сбор GC, который вызовет ваш обработчик событий 2x.