检测并重新启动崩溃的.NET应用程序

时间:2009-02-08 14:42:39

标签: .net

如何检测我的.NET应用程序已崩溃,然后重新启动它?

4 个答案:

答案 0 :(得分:14)

另一种解决方案(基于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);
        }
    }

答案 1 :(得分:8)

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

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

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

  • 注册 Application.ThreadException 事件,例如在C#中:

    Application.ThreadException + = new Threading.ThreadExceptionHandler(CatchFatalException);

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

  • 如果是Windows窗体应用,请在 CatchFatalException 事件处理程序中调用Application.Restart方法。
  • 否则您将需要p / invoke到application restart and recovery本机函数。该链接讨论了Vista,但在我的测试中,它在XP上运行得很好。

答案 2 :(得分:5)

  • 在AppDomain中运行工作;使用主AppDomain来监控它(但不防止进程终止)
  • 许多异常处理!即不要让致命的错误推翻这个过程
  • 在已经内置回收的内容中运行它 - 例如IIS

答案 3 :(得分:1)

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

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

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