让一个 .Net 应用程序在崩溃时关闭

3
我有一个在Windows Server 2008 R2上运行的.NET 4 应用程序,我使用一个独立的运行进程来管理它的生命周期(即检测打开/意外关闭/重启)。这对于典型情况下工作得很好。然而,当应用程序抛出异常时,Windows会弹出调试窗口,询问是否要调试应用程序。我只想让应用程序崩溃,以便进程运行器可以检测到崩溃并进行相应的管理。
如何允许应用程序在发生异常时关闭?

你知道应用程序崩溃的条件吗?如果是这样,你是否编写了适当的异常处理呢? - Coder323
不要在服务器上安装Visual Studio。 - Hans Passant
3个回答

4

在应用程序的 Application.ThreadException 中添加一个处理程序,在处理程序中记录事件,然后正常退出。

此外,还要添加一个事件处理程序到 AppDomain.CurrentDomain.UnhandledException 中。

未处理异常MSDN

编辑:感谢Alex提醒,已删除有关Handled标志的内容。


1

添加这行代码将防止显示“调试窗口”。

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

此设置仅影响 Windows Forms 异常。 - Rick Sladkey

0
你应该添加一个全局异常处理程序或者一个try/catch块来清理资源,记录错误并正常关闭应用程序。

@Pedery,你能详细说明一下吗? - Christian.K
当然可以!但这取决于你的应用程序是否对性能要求很高。我最后一个开发的项目是一个3D CAD程序,每次鼠标移动都会产生大量计算。将性能关键块包含在try子句中会显著影响性能。不过我们的代码已经去除了所有这些内容。 - Pedery
@Pedery 是的,这可能是真的。但Jeff说的是一个“全局”异常处理程序或(我假设)“全局”try/catch块。现在我再次阅读它,我不确定那是否被理解了,还是只是我的想法;-) 无论如何,全局异常处理程序(例如在Main()中)几乎不会有任何可测量的性能影响。 - Christian.K
也许这是正确的,我还没有进行基准测试。然而,即使像全局建议的那样处理,你也可以期望类似于try/catch的东西将包围你的代码在IL中,这可能是罪魁祸首。无论如何,现在只是在猜测。 - Pedery
对,我是指全局处理程序或全局捕获块。当然,try/catch块会有性能损失。我不知道IL中的错误处理程序是如何实现的。如果它基本上是一个全局的try/catch或者其他不同的东西,我也不会感到惊讶。我从来没有在处理Application.OnError事件时遇到过任何性能问题,但我从来没有处理过像3D CAD应用程序这样快的东西。 - Jeff

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