2011-03-14 191 views
6

崩溃恢复构建到我的应用程序中的最佳方式(标准解决方案)可以在任何类型的崩溃时自动重新启动。应用程序中的崩溃恢复

tnx。

+0

你的应用程序中是否有任何状态? – 2011-03-14 18:14:54

+0

对不起,“状态”? – MBZ 2011-03-14 18:26:41

+0

状态,如当前视图,未保存的更改,导航历史记录,有关应用程序“所在”的内容以及用户创建的内容。 – 2011-03-14 18:41:18

回答

6

您在这里有几个选项。

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

第二个选择是有一个监视服务,它只是测试,看看当前的应用程序是否仍在工作。如果不是,那么强制杀死现有应用程序并重新启动一个新实例。

第三个选项是将您的应用程序分成两个应用程序。简单地执行其他进程的外部“容器”类型应用程序。容器应用程序不会有UI,但会启动主流程并观察它(很像上面的选项2)。我见过这种应用在各种“模块化”应用中。

问题是,唯一真正的方法是有2个应用程序:一个用于监视,另一个用于实际执行用户界面和其他所有操作。

+4

全局错误'处理程序'无法处理很多错误,因为它很少有足够的上下文来知道是否可以继续安全(即应用程序状态是否仍然有效。 )为了处理真正的崩溃(在适当的层面上无法处理或未处理的异常),我投票选择了主流程解决方案,该解决方案在主流程中启动和停止。在.NET中,这通常可以通过为托管应用程序使用单独的AppDomain来完成,而不需要完全独立的进程。 – 2011-03-14 18:57:03

0

将持久状态置于支持事务的东西中。例如。数据库(sqlite)或者如果需求不太复杂,在写入时使用copy(写入更改为新文件,并且只有在成功丢弃旧文件的情况下)。

这些建议非常通用。

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

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

+0

Windows Services使用的不断重新启动的崩溃过程的一种解决方案是限制尝试重新启动过程的次数。当你有一个外部的'托管'进程监视启动的应用程序,并因此可以维护关于其崩溃的状态时,这最有效。与基于UI的应用程序相比,这对服务更好,但至少在服务方面,崩溃和重新启动对用户来说基本上是透明的。 – 2011-03-14 18:50:13

+0

如何恢复应用程序的状态?每个单位都可以拥有对延续申请至关重要的状态。 – Arijoon 2017-09-07 16:14:05