我在项目的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应用程序。我在应用程序中也有非托管代码,以使登录更安全。我没有遇到任何问题,但我需要确保如果出现问题,使用退出流程是最好的选择。
答案 0 :(得分:2)
正确关闭WPF应用的方法是使用Application.Shutdown
。这指示所有消息泵停止,并允许执行清理代码(例如关闭事件)。它还使所有非后台线程运行。在您的情况下,这可能不是您想要的。
由于您有未处理的例外,您的系统处于未知状态 - 您无法假设您的结束事件将正常运行,并且任何正在运行线程将优雅地终止。因此,我建议使用Environment.Exit
,这将关闭进程,并且所有进程都在运行。但它将运行您的finally
块和类终结器,通常用于释放获取的资源。
如果您认为在当前状态下运行终结器可能会导致现有数据/资源损坏,或者对系统造成任何其他类型的损坏,则应使用Environment.FailFast
代替。这将指示操作系统立即终止您的进程,而无需运行任何终结器。您可能希望在Environment.Exit
上使用此功能,具体取决于您的应用目的。
答案 1 :(得分:1)
要退出控制台应用程序,请尝试
Environment.Exit(0);
对于Windows应用程序,请尝试:
Application.Exit(0);