Próbuję ustalić, dlaczego moja aplikacja konsolowa nie została zerwana przez nieobsługiwany wyjątek zadania. Wszystko, co robię, to utworzyć zadanie, w którym natychmiast zgłaszam wyjątek. Wreszcie wymuszam GC. W pierwszym przykładzie mam program obsługi zdarzenia TaskScheduler.UnobservedTaskException
i widzę, że wyjątek zostanie obsłużony.Aplikacja konsoli nie została zerwana przez nieobsługiwany wyjątek zadania.
static async Task ThrowsException()
{
Console.WriteLine("Throwing!");
throw new Exception("Test exception");
}
static void Main(string[] args)
{
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
ThrowsException();
Console.WriteLine("Collecting garbage.");
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Done collecting garbage.");
Console.ReadKey();
}
static void TaskScheduler_UnobservedTaskException(object sender,
UnobservedTaskExceptionEventArgs e)
{
Console.WriteLine("Unobserved task exception occured in finalizer.");
Console.WriteLine(e.Exception.InnerException.Message);
}
wyjściowa:
Throwing!
Collecting garbage.
Unobserved task exception occured in finalizer.
Test exception
Done collecting garbage.
Ale gdybym wykomentuj linię TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException
program nadal działa do końca. W tym przypadku wyjście jest:
Throwing!
Collecting garbage.
Done collecting garbage.
Dlaczego nie katastrofa zastosowanie w tym przypadku?