gpt4 book ai didi

.net - TaskScheduler.UnobservedTaskException 永远不会被调用

转载 作者:行者123 更新时间:2023-12-03 23:51:27 30 4
gpt4 key购买 nike

根据我的研究,我了解到以下内容:

  • TaskScheduler.UnobservedTaskException必须等待任务被垃圾回收,然后该任务的未观察到的异常才会冒泡到 UnobservedTaskException事件。
  • 如果您使用的是 Task.Wait() ,无论如何它都不会被调用,因为您阻塞了来自任务的即将发生的结果,因此异常将在 Task.Wait() 上抛出。而不是冒泡到 UnobservedException事件。
  • 调用 GC.Collect()除非您确切地知道自己在做什么,否则手动通常是一个坏主意,因此在这种情况下确认事情很好,但不能作为问题的正确解决方案。

  • 问题

    如果我的应用程序在垃圾收集器启动之前退出,我绝对 100% 无法获得我的 UnobservedTaskException事件触发。

    请注意以下代码:
    class Program
    {
    static void Main(string[] args)
    {
    TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

    Task.Factory.StartNew(() =>
    {
    Console.WriteLine("Task started.");
    throw new Exception("Test Exception");
    });

    Thread.Sleep(1000);
    //GC.Collect();
    //GC.WaitForPendingFinalizers();
    }

    static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
    {
    File.WriteAllText(@"C:\data\TestException.txt", e.Exception.ToString());
    Console.WriteLine("UNOBSERVED EXCEPTION");
    }
    }

    没有写入异常文件,也没有向控制台写入任何内容。应用程序退出后 10-15 分钟甚至更长时间,我仍然没有看到我的应用程序的剩余部分被垃圾收集的证据。你可能会问,为什么不在导出收集呢?好吧,我的真实世界场景是 我的异常捕获在 Windows 服务中托管的 WCF 服务中运行。我无法在 Windows 服务关闭时捕获(因此手动调用 GC.Collect() ),因为据我所知没有事件。

    我哪里错了?我如何确保如果 WCF 服务内部的某些东西最终会破坏我的 Windows 服务,我有机会在服务失败之前记录异常?

    最佳答案

    对我来说,TaskScheduler.UnobservedTaskException 起初给人一种非常错误的安全感。如果依赖垃圾回收,真的不值多少。

    我找到了以下解决方案,取自 this msdn article ,要可靠得多。它基本上只在 task1 中有未处理的异常时才执行延续块(记录异常的地方),并且不会阻止 UI 执行。

    您可能还想展平嵌套的 AggregateExceptions 并创建一个扩展方法,如 Reed Copsey depicted here .

    var task1 = Task.Factory.StartNew(() =>
    {
    throw new MyCustomException("Task1 faulted.");
    })
    .ContinueWith((t) =>
    {
    Console.WriteLine("I have observed a {0}",
    t.Exception.InnerException.GetType().Name);
    },
    TaskContinuationOptions.OnlyOnFaulted);

    关于.net - TaskScheduler.UnobservedTaskException 永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3973315/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com