Sto cercando di capire perché la mia app per console non viene abbattuta da un'eccezione di attività non gestita. Tutto ciò che faccio è creare un'attività in cui lancio immediatamente un'eccezione. Finalmente costringo GC. Nel primo esempio ho un gestore per l'evento TaskScheduler.UnobservedTaskException
e posso vedere che l'eccezione viene gestita.Applicazione console non eliminata da un'eccezione di attività non gestita
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);
}
uscita:
Throwing!
Collecting garbage.
Unobserved task exception occured in finalizer.
Test exception
Done collecting garbage.
Ma se io commento la linea TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException
il programma viene eseguito ancora a compimento. In questo caso l'output è:
Throwing!
Collecting garbage.
Done collecting garbage.
Perché non fa il crash dell'applicazione in questo caso?