代码之家  ›  专栏  ›  技术社区  ›  Hosam Aly

检测并重新启动我的崩溃。net应用

  •  11
  • Hosam Aly  · 技术社区  · 16 年前

    我怎么能发现我的。NET应用程序崩溃,然后重新启动?

    4 回复  |  直到 16 年前
        1
  •  14
  •   Hosam Aly    16 年前

    另一种解决方案(基于 this example )是创建一个控制应用程序的启动器:

    class LauncherProgram
    {
        static int count = 3;
    
        static void Main()
        {
            Launch();
            Thread.Sleep(Timeout.Infinite);
        }
    
        static void Launch()
        {
            Process process = new Process();
            process.StartInfo.FileName = "MyApp.exe";
            process.EnableRaisingEvents = true;
            process.Exited += LaunchIfCrashed;
        }
    
        static void LaunchIfCrashed(object o, EventArgs e)
        {
            Process process = (Process) o;
            if (process.ExitCode != 0)
            {
                if (count-- > 0) // restart at max count times
                    Launch();
                else
                    Environment.Exit(process.ExitCode);
            }
            else
            {
                Environment.Exit(0);
            }
        }
    
        2
  •  8
  •   HTTP 410    16 年前

    如果这是Windows窗体应用程序:

    • 设置 jitDebugging=true 在App中。配置。这可以防止触发内置的Windows窗体未处理的异常处理程序。

    现在,无论这是Windows窗体应用程序还是控制台应用程序:

    • 注册 应用程序。线程异常 事件,例如在C#中:

      应用程序。ThreadException+=新线程。ThreadExceptionHandler(CatchFatalException);

    此时,你的应用程序已经进入了黑洞。接下来会发生什么取决于这是否是Windows窗体应用程序:

        3
  •  5
  •   Marc Gravell    16 年前
    • 在AppDomain中运行工作;使用主AppDomain对其进行监视(但不能防止进程终止)
    • 大量的异常处理!也就是说,不要让致命的错误破坏流程
    • 在已经内置回收功能的东西中运行它,例如IIS
        4
  •  1
  •   Hosam Aly    16 年前

    一种可能的解决方案是创建另一个进程来监视您的应用程序,并在终止时重新启动它:

    class ProcessMonitorProgram
    {
        const string myProcess = "MyApp.exe";
    
        static void Main()
        {
            new Timer(CheckProcess, null, 0, 60 * 1000);
            Thread.Sleep(Timeout.Infinite);
        }
    
        static void CheckProcess(object obj)
        {
            if (Process.GetProcessesByName(myProcess).Length == 0)
                Process.Start(myProcess);
        }
    }
    

    此解决方案的一个问题是,它将使进程永远重新启动,直到此监控应用程序本身终止。

    推荐文章