为什么当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();
}

为什么当Task抛出异常时,没有触发UnobservedTaskException事件处理程序?

您没有等待任务执行完成。这意味着你的应用程序将在任务抛出异常之前结束。

如果您只是添加一个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();
}
相关文章:
  • 没有找到相关文章