2009-02-08 113 views
11

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

+0

我发现这个问题的一些解决方案(之前我问),所以我认为这将是很好的答案在SO。如果您有其他答案,请成为我的客人。或者只是投票指导其他人的最佳答案。如果您认为合适,请重新提交此问题。 – 2009-02-08 14:43:15

+0

添加了关于重新启动控制台应用程序的信息,因为这显然是您正在使用的。 – RoadWarrior 2009-02-09 09:30:35

回答

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

唯一可能的升级方法是将“看门狗”设置为Windows服务。 – 2009-02-08 15:02:10

+0

更好地添加一些时间戳代码并检测应用程序是否在启动时崩溃 – Sean 2014-08-06 01:45:39

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

一个与此解决方案的问题是,它会保持进程重启永远,直到这个监控应用程序本身被终止。

5
  • 运行一个AppDomain内的工作;使用主AppDomain来监视它(虽然不防止进程kill)
  • 大量的异常处理!即不要让一个致命的错误推倒过程
  • 在一些已经有内置的循环来看,这 - IIS例如
8

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

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

现在无论这是一个Windows窗体应用程序或一个控制台应用程序:

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

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

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