c# - 应用程序如何正确崩溃?

标签 c# wpf exception

我的项目的 App 类中有一个未处理异常的处理程序。这是为了设置一个发送反馈按钮。

App.xaml.cs

private void Application_DispatcherUnhandledException(
    object sender, DispatcherUnhandledExceptionEventArgs e)
{
    try
    {
        // Try to collect feedback with dialog.
        new ApplicationExceptionDialog(e).ShowDialog();
    }
    catch
    {
        MessageBox.Show(
            "A problem has occurred with the program:\r\n\r\n" +
            e.Exception.Message + "\r\n\r\n" +
            "The application will now exit.",
            "Application Error",
            MessageBoxButton.OK,
            MessageBoxImage.Error);
    }
    finally
    {
        Application.Current.Shutdown(1); // ← Is this okay?
    }
}

问题

除了处理各种异常,当所有其他方法都失败时,在出现未处理的异常后退出应用程序的正确方法是什么?

编辑

此问题特定于 WPF 应用程序。我在应用程序中也有非托管代码,以使登录更加安全。我没有遇到任何问题,但我需要确保如果出现问题,所使用的退出流程是最佳选择。

最佳答案

关闭 WPF 应用程序的正确方法是使用 Application.Shutdown .这会指示所有消息泵停止,并允许您执行清理代码(例如关闭事件)。它还使所有非后台线程保持运行。在您的情况下,这可能不是您想要的

由于您有一个未处理异常,您的系统处于未知状态 - 您不能假设您的关闭事件会正确运行,并且任何正在运行的线程都会优雅地终止。因此,我建议使用 Environment.Exit ,这将关闭进程,以及所有正在运行的线程。但它会运行您的 finally block 和类终结器,它们通常用于释放获取的资源。

如果您认为在当前状态下运行终结器可能会导致现有数据/资源损坏,或对系统造成任何其他类型的损坏,您应该使用 Environment.FailFast反而。这将指示操作系统立即终止您的进程,而不运行任何终结器。根据您的应用程序的目的,您可能希望通过 Environment.Exit 使用它。

关于c# - 应用程序如何正确崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35475106/

相关文章:

c# - Entity Framework 4.3 和 Moq 无法创建 DbContext 模拟

c# - 在透明的 Windows.Form 中托管 WPF UserControl

c# - 匿名对象内的条件运算符

c# - Prism 5 - MVVM 框架

ruby-on-rails - Begin 和 Rescue block 异常处理

Java:为什么 PrintWriter 或 PrintStream 类不抛出异常?

c# - ConfigureAwait(false) 在这里实现了什么

wpf - 我可以让 WPF 样式优先于本地值吗?

c# - WPF:动态连接 Canvas 上的矩形与之间的路径

vb.net - 有没有办法让我的 VB.NET 程序执行某种 "dying breath" Action ?