应用程序中的崩溃恢复

时间:2011-03-14 18:12:32

标签: c# desktop-application

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

TNX。

3 个答案:

答案 0 :(得分: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);
    }
}

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

答案 1 :(得分:6)

你有几个选择。

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

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

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

关键是,唯一真正的方法是拥有2个应用程序:一个用于监控,另一个用于实际用户界面以及其他所有应用程序。

答案 2 :(得分:0)

将持久状态置于支持事务的状态。例如。数据库(sqlite)或者如果需求不是太复杂,请使用copy on write(写入对新文件的更改,并且只有在成功时才丢弃旧文件)

这些建议非常通用。