繁体   English   中英

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

[英]Preventing unhandled exceptions to stop application

我对异常处理有疑问。

为了防止“ [[您的程序]]停止工作” 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分钟。 还有其他任何建议吗?

哦,当然,这是“不应该发生的极端紧急情况”,但是不幸的是,这主要是由于我们依赖于公司其他分支机构管理的其他系统,而我对此没有任何控制权抱怨(是的,国际公司有时会很烂),并且在代码中不是try / catchable :(

谢谢!

我从您所写的内容中假设您希望应用程序是关键任务,这意味着,如果发生任何使它失败的事情,则需要自动重新启动它。

实现此目的的最佳方法是创建第二个看门狗进程,该进程将在应用程序出现故障时重新启动。 然后,您可以允许应用程序在发生未处理的异常时悄悄地终止自身,从而清理未处理的异常处理器中可以执行的所有操作。

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

// 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上没有特权问题。

如果用户关闭应用程序并且您不希望它再次运行,则可以向看门狗进程发送信号(例如,使用命名管道,或者使用第二种等待句柄,当您希望看门狗挂起时锁定该等待句柄或关闭),则表明该应用已关闭且不应重新启动。

您可以在启动文件夹或其他一些自动方法中启动看门狗,或者可以让您的应用在首次运行时启动它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM