为什么计时器线程上未处理的异常不会使进程崩溃
我知道使用 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 Task
s, 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
来自 .NET 4.0 文档:
http://msdn.microsoft.com/en-us/library /system.timers.timer.aspx
目前还没有任何声明声称此行为实际上已经改变。
From the .NET 4.0 documentation:
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
There is no statement yet claiming that this behavior has actually changed.