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

发布于 2025-01-07 21:30:03 字数 484 浏览 0 评论 0原文

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

I am aware of how unhanded exceptions are processed when using Tasks, only throwing an unhandled in the finalizer if user code hasn't 'observed' it yet.

I am also aware of how an unhandled exception in an async thread (e.g. Action.BeginInvoke()) is caught and re-thrown on the joining call (e.g. Action.EndInvoke()).

What I don't understand though is how this doesn't crash the process?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

江挽川 2025-01-14 21:30:03

来自 .NET 4.0 文档:

在 .NET Framework 2.0 及更早版本中,Timer 组件
捕获并抑制事件处理程序抛出的所有异常
已过去的事件。此行为可能会在未来版本中发生变化
.NET Framework 的一部分。

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

目前还没有任何声明声称此行为实际上已经改变。

From the .NET 4.0 documentation:

In the .NET Framework version 2.0 and earlier, the Timer component
catches and suppresses all exceptions thrown by event handlers for the
Elapsed event. This behavior is subject to change in future releases
of the .NET Framework.

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

There is no statement yet claiming that this behavior has actually changed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文