将崩溃恢复构建到我的应用程序中的最佳方法(标准解决方案可能)是什么,以便它可以在任何类型的崩溃时自动重启。
TNX。
答案 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(写入对新文件的更改,并且只有在成功时才丢弃旧文件)
这些建议非常通用。