为什么当Task抛出异常时,没有触发UnobservedTaskException事件处理程序?
本文关键字:UnobservedTaskException 事件处理 程序 Task 抛出异常 为什么 | 更新日期: 2023-09-27 18:14:05
我有下面的测试程序,它设置UnobservedTaskException但是OnTaskException方法永远不会执行。什么好主意吗?
注意:
如果我删除"for循环",那么一切都像预期的那样工作。
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
并让任务抛出异常,您将得到通知:
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();
}