检测并重新启动崩溃的.NET应用程序
另一种解决方案(基于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);
}
}
唯一可能的升级方法是将“看门狗”设置为Windows服务。 – 2009-02-08 15:02:10
更好地添加一些时间戳代码并检测应用程序是否在启动时崩溃 – Sean 2014-08-06 01:45:39
一个可能的解决方案是创建另一个进程监视应用程序,并重新启动它,如果它被终止:
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);
}
}
一个与此解决方案的问题是,它会保持进程重启永远,直到这个监控应用程序本身被终止。
- 运行一个AppDomain内的工作;使用主AppDomain来监视它(虽然不防止进程kill)
- 大量的异常处理!即不要让一个致命的错误推倒过程
- 在一些已经有内置的循环来看,这 - IIS例如
如果这是一个Windows窗体应用程序:
- 套装jitDebugging = true in App.Config。这可以防止内置的Windows窗体未处理的异常处理程序被触发。
现在无论这是一个Windows窗体应用程序或一个控制台应用程序:
-
注册为Application.ThreadException事件,例如在C#中:
Application.ThreadException + = new Threading.ThreadExceptionHandler(CatchFatalException);
此时,您的应用程序已进入黑洞。接下来会发生什么取决于这是否是一个Windows窗体应用程序:如果它是一个Windows窗体应用程序
- ,请致电您的CatchFatalException事件处理Application.Restart方法。
- 否则,您将需要p /调用application restart and recovery本地函数。该链接讨论Vista,但在我的测试中,它在XP上的工作情况也很好。
我发现这个问题的一些解决方案(之前我问),所以我认为这将是很好的答案在SO。如果您有其他答案,请成为我的客人。或者只是投票指导其他人的最佳答案。如果您认为合适,请重新提交此问题。 – 2009-02-08 14:43:15
添加了关于重新启动控制台应用程序的信息,因为这显然是您正在使用的。 – RoadWarrior 2009-02-09 09:30:35