【问题标题】:Why an unhandled exception on timer thread doesn't crash the process为什么计时器线程上未处理的异常不会使进程崩溃
【发布时间】:2012-02-23 04:13:39
【问题描述】:

我知道在使用 Tasks 时如何处理未处理的异常,如果用户代码尚未“观察到”它,只会在终结器中抛出未处理的异常。

我也知道异步线程中未处理的异常(例如Action.BeginInvoke())是如何在加入调用(例如Action.EndInvoke())时被捕获并重新抛出的。

但我不明白的是,这如何不会导致进程崩溃?

    static void Main(string[] args)
    {
        var timer = new System.Timers.Timer() {Interval = 100};
        timer.Elapsed += (o, e) => { throw new Exception(); };
        timer.Start();

        Console.ReadKey( true );
    }

【问题讨论】:

  • 嗯,这是我生命中的 4-6 个小时,我永远不会回来。微软为了不崩溃,这是多么可怕的决定。

标签: .net multithreading c#-4.0 asynchronous unhandled-exception


【解决方案1】:

来自 .NET 4.0 文档:

在 .NET Framework 2.0 及更早版本中,Timer 组件 捕获并抑制由事件处理程序抛出的所有异常 已过的事件。此行为可能会在未来版本中更改 .NET 框架。

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

目前还没有声明声称这种行为实际上已经改变。

【讨论】:

  • 啊,就是这样,谢谢 - 我确实读过那个页面,但一定错过了。我认为我愚蠢地认为,与他们不抑制未处理异常的所有标准做法背道而驰的东西会出现在那些漂亮的黄色盒子之一中。
  • @Tyson,同意了。它引入了与其他地方的丑陋不一致。
猜你喜欢
  • 2011-09-21
  • 2021-11-13
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2019-01-27
  • 2012-12-27
相关资源
最近更新 更多