为什么定时器线程上的未处理异常不会使进程崩溃?

7
我知道在使用Task时如何处理未处理的异常,只有在用户代码没有“观察”它之前才会在终结器中抛出未处理的异常。
我也知道异步线程(例如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个小时的生命啊。微软做出了多么糟糕的决定,竟然没有崩溃。 - Chris Marisic
1个回答

9

从.NET 4.0文档中得知:

在.NET Framework 2.0及更早版本中,Timer组件会捕获并抑制Elapsed事件的所有事件处理程序抛出的异常。这种行为可能会在将来的.NET Framework版本中发生变化。

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

目前尚未有声明称这种行为已经发生改变。


啊,就是这样,谢谢 - 我确实读了那个页面,但可能错过了它。我认为我愚蠢地假设违反他们所有不抑制未处理异常的标准惯例的东西会在其中一个漂亮的黄色框里。 - Tyson
@Tyson,同意。这与其他地方产生了不美观的不一致。 - Lex Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接