У меня есть ниже тестовая программа, которая устанавливает UnobservedTaskException, однако метод OnTaskException никогда не выполняется. Есть идеи?
ПРИМЕЧАНИЕ.
Если я удалю "цикл цикла", тогда все будет работать так, как ожидалось.
static void Main()
{
SetupUnobservedTaskExceptionHandling();
Task.Factory.StartNew(() =>
{
var counter = 5;
for (; counter > 0; counter--)
{
Console.WriteLine(counter);
Thread.Sleep(1000);
}
throw new InvalidCastException("I threw up!");
});
GC.Collect();
GC.WaitForPendingFinalizers();
Console.ReadLine();
}
private static void SetupUnobservedTaskExceptionHandling()
{
TaskScheduler.UnobservedTaskException += OnTaskException;
}
private static void OnTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
Console.WriteLine("Error!" + e.Exception);
e.SetObserved();
}
Вы не дожидаетесь завершения выполнения задачи. Это означает, что ваше приложение закончится до того, как задача выдает исключение.
Если вы просто добавите Thread.Sleep
и пусть задача Thread.Sleep
исключение, вы будете уведомлены:
private static void Main()
{
SetupUnobservedTaskExceptionHandling();
Task.Factory.StartNew(() =>
{
var counter = 5;
for (; counter > 0; counter--)
{
Console.WriteLine(counter);
Thread.Sleep(1000);
}
throw new InvalidCastException("I threw up!");
});
Thread.Sleep(10000);
GC.Collect();
GC.WaitForPendingFinalizers();
Console.ReadLine();
}
Thread.Sleep(1000);
внутри него. Когда вы удаляете его, задание выдается сразу перед вызовом GC.Collect
GC.Collect
.