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

时间:2012-02-23 04:13:39

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

我知道在使用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 );
    }

1 个答案:

答案 0 :(得分:9)

从.NET 4.0文档:

  

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

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

尚未声明此行为实际已发生变化。