C# 应用程序中的崩溃恢复

C# 应用程序中的崩溃恢复,c#,desktop-application,C#,Desktop Application,在我的应用程序中构建崩溃恢复的最佳方法(可能是标准解决方案)是什么,这样它就可以在任何类型的崩溃时自动重新启动 tnx.您在这里有一些选择 第一个(也是最好的)方法是添加某种类型的全局错误处理,它将捕获任何其他未捕获的异常并正确处理它们。按照这些思路,您应该开始向代码库添加适当的特定异常处理。请记住,堆栈溢出和某些安全性和内存异常都将超出任何全局处理 第二个选择是提供一个监控服务,该服务只测试当前应用程序是否仍在工作。如果不是,则强制杀死现有应用程序并重新启动新实例 第三种选择是将应用程序分为两

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


tnx.

您在这里有一些选择

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

第二个选择是提供一个监控服务,该服务只测试当前应用程序是否仍在工作。如果不是,则强制杀死现有应用程序并重新启动新实例

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


关键是,真正做到这一点的唯一方法是有两个应用程序:一个用于监视,另一个用于实际执行UI和其他所有操作。

将您的持久状态置于支持事务的应用程序中。例如,数据库(sqlite)或如果需求不太复杂,则使用写时复制(将更改写入新文件,并且仅在成功时放弃旧文件)


这些建议非常通用。

一般来说,最好不要这样做,一个不断启动并立即再次崩溃的过程没有什么好处,用户无助地看着这场大屠杀。但我只能把子弹交给你,把枪对准你的脚取决于你。您需要这样的代码:

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

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

您的应用程序中有任何状态吗?状态,如当前视图、未保存的更改、导航历史记录,以及有关应用程序“所在”的内容和位置的所有信息用户创建的内容。@Albin:几乎所有生成的应用程序都属于该定义。Windows Services使用的不断重新启动崩溃进程的一种解决方案是限制其尝试重新启动进程的次数。当您有一个外部“托管”进程来监视已启动的应用程序并因此可以维护其崩溃状态时,这种方法最为有效。与基于UI的应用程序相比,这对服务更有效,但是,至少对于服务而言,崩溃和重新启动对用户来说是透明的。恢复应用程序的状态如何?每个单元都可能具有对应用程序的继续至关重要的状态。全局错误“处理程序”无法处理许多错误,因为它很少有足够的上下文来知道是否可以继续(即应用程序状态是否仍然有效)以处理真正的崩溃(无法或未在适当层处理的例外情况),我投票支持宿主进程解决方案,该解决方案使用主进程启动和停止。在.NET中,这通常可以通过为宿主应用程序使用单独的AppDomain来干净地完成,而不需要完全单独的进程。