防止未处理的异常停止应用程序

时间:2011-09-21 07:54:41

标签: wpf exception exception-handling

我对异常处理有疑问。

为防止“[YourProgram]已停止工作”Windows对话框,我通常会以这种方式捕获未处理的异常:

在App.xaml.cs中:

    protected override void OnStartup(StartupEventArgs e)
    {
        Application.Current.DispatcherUnhandledException += ProcessDispatcherException;
        AppDomain.CurrentDomain.UnhandledException += ProcessUnhandledException;
        // Blah blah blah... Performs a lot of loading operations...
        mainWindow.Show();
    }

然后

    private void ProcessUnhandledException(object o, UnhandledExceptionEventArgs e)
    {
        logException("An unhandled exception has been thrown\n"+(e.ExceptionObject as Exception).ToString(), e.ExceptionObject as Exception);
        Application.Current.Shutdown();
    }

好的,我没有Windows对话框。现在理想情况下我想阻止这种力量关闭的情况。我正在开发的应用程序的启动时间大约持续1分钟,对于最轻的用户(大多数用户需要等待2或3分钟才能启动它,它必须加载非常大且复杂的数据参考),因此重新启动它会引起麻烦

我想了解这个案例的“最佳做法”。我正在考虑只是在处理程序中重新创建一个新窗口并重新显示它,所以只有UI将重新初始化为启动状态,不会加载其他参考,保存2 - 3分钟。还有其他任何建议吗?

哦,当然,这是“不应该达到的极端紧急情况”,但不幸的是,这主要是由于我们依赖于公司其他部门管理的其他系统,我没有任何控制或投诉的权利(是的,国际公司可以在某个时候吮吸),并且它不是在代码中尝试/捕获:(

谢谢!

1 个答案:

答案 0 :(得分:3)

我假设您正在编写的内容,您希望您的应用程序成为关键任务,这意味着,如果发生任何事情导致其失败,则需要自动重新启动。

实现此目标的最佳方法是创建第二个监视程序进程,以便在应用程序失败时重新启动它。然后,当存在未处理的异常时,您可以允许应用程序安静地终止自身,清除未处理的异常处理器中的任何内容。

实现这样的监视程序的最简单方法是使用后台线程循环进行无窗口进程(例如,控制台应用程序),通过检查等待句柄是否被锁定来定期检查应用程序是否正在运行。像这样:

// Declared in class
object checkLocker = new object();
bool mtStopCheck = false;

// Thread loop
bool stopCheck = false;
while (stopCheck == false)
{
    if (wait_handle_is_unlocked)
        restart_application();
    Thread.Sleep(1000);

    lock (checkLocker)
    {
        stopCheck = mtStopCheck;
    }
}

当你想关闭看门狗时,另一个线程会这样做:

// Stop the watchdog thread so the watchdog app can shut down
lock (checkLocker)
{
    mtStopCheck = true;
}

由于您将在同一个终端会话中运行,因此您不需要全局等待句柄,因此Vista / Windows 7上没有特权问题。

如果用户关闭了应用程序并且您不希望它再次运行,您可以向监视程序进程发送信号(例如,使用命名管道,或使用您想要时锁定的第二种等待句柄监视器暂停或关闭)应用程序已关闭,不应重新启动。

您可以在启动文件夹或其他一些自动方法中启动监视程序,或者,您可以让应用程序在第一次运行时启动它。