应用程序中的崩溃恢复

MBZ*_*MBZ 6 c# desktop-application

在我的应用程序中构建崩溃恢复的最佳方法(可能是标准解决方案)是什么,因此它可以在任何类型的崩溃时自动重启.

TNX.

Han*_*ant 10

通常最好不要这样做,没有什么可以不断开始的过程,并且用户无助地看着大屠杀再次立即崩溃.但我只能递给你子弹,瞄准你脚下的枪是由你决定的.你需要这样的代码:

    static void Main(string[] args) {
        AppDomain.CurrentDomain.UnhandledException += ReportAndRestart;
        // etc..
    }

    static void ReportAndRestart(object sender, UnhandledExceptionEventArgs e) {
        string info = e.ExceptionObject.ToString();
        // Log or display info 
        //...
        // Let the user know you're restarting
        //...
        // And restart:
        System.Diagnostics.Process.Start(
            System.Reflection.Assembly.GetEntryAssembly().Location,
            string.Join(" ", Environment.GetCommandLineArgs()));
        Environment.Exit(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在命令行参数上使用了快捷方式.如果它们包含指向包含空格的文件的路径,则应引用它们.不要对你应该放在省略号中的代码进行快捷方式.


Not*_*tMe 6

你有几个选择.

第一个(也是最好的)是添加某种类型的全局错误处理,它将捕获任何未捕获的异常并正确处理它们.沿着这些方向,您应该开始向代码库添加适当的特定异常处理.请记住,无论如何,堆栈溢出和某些安全性和内存异常都会超过任何全局处理.

第二种选择是建立一个监控服务,只测试当前应用程序是否仍在运行.如果不是,则强制终止现有应用程序并重新启动新实例.

第三种选择是将您的应用程序分成两个应用程序.外部"容器"类型应用程序,只执行其他进程.容器应用程序将没有UI,但会启动主进程并观看它(很像上面的选项2).我见过这个用于各种"模块化"应用程序.

关键是,唯一真正的方法是拥有2个应用程序:一个用于监控,另一个用于实际执行用户界面和其他所有操作.

  • 全局错误"处理程序"无法处理许多错误,因为它很少有足够的上下文来知道是否可以继续安全(即应用程序状态是否仍然有效).为了处理真正的崩溃(异常不可能或者是没有在适当的层处理),我投票给主机进程解决方案,它与主进程一起启动和停止.在.NET中,通常可以通过为托管应用程序使用单独的AppDomain来干净地完成此操作,而不是需要完全独立的过程. (4认同)