gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:13:50 25 4
gpt4 key购买 nike

我有一个关于异常处理的问题。

为防止出现“[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 分钟。还有其他建议吗?

哦,当然,这是“不应该到达的极端紧急情况”,但不幸的是,这主要是由于我们对公司其他分支机构管理的其他系统的依赖,我没有任何控制权或权利提示(是的,国际公司有时会很糟糕),而且它在代码中无法尝试/捕获:(

谢谢!

最佳答案

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

实现此目的的最佳方法是创建第二个看门狗进程,该进程将在应用程序失败时重新启动。然后,您可以允许您的应用程序在出现未处理的异常时安静地自行终止,清除未处理的异常处理器中的所有内容。

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

// 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;
}

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

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

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

关于wpf - 防止未处理的异常停止应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7496367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com