繁体   English   中英

为什么未为引发异常的Task触发UnobservedTaskException事件处理程序?

[英]Why is the UnobservedTaskException event handler not triggered for a Task which throws an exception?

我有以下性能测试,其设置然而从不执行所述OnTaskException方法UnobservedTaskException。 有任何想法吗?

注意

如果我删除“ for loop ”,那么一切都会按预期进行。

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM