检测并重新启动崩溃的.NET应用程序
如何检测到我的.NET应用程序已崩溃,然后重新启动它?一种可能的解决方案是创建另一个进程来监视你的应用程序,并在应用程序终止时重新启动它:检测并重新启动崩溃的.NET应用程序,.net,.net,如何检测到我的.NET应用程序已崩溃,然后重新启动它?一种可能的解决方案是创建另一个进程来监视你的应用程序,并在应用程序终止时重新启动它: class ProcessMonitorProgram { const string myProcess = "MyApp.exe"; static void Main() { new Timer(CheckProcess, null, 0, 60 * 1000); Thread.Sleep(Time
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);
}
}
此解决方案的一个问题是,它将使进程永远重新启动,直到此监控应用程序本身终止。另一个解决方案(基于)是创建一个控制应用程序的启动器:
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);
}
}
- 在AppDomain中运行工作;使用主AppDomain对其进行监视(但不防止进程终止)
- 大量的异常处理!i、 e.不要让致命错误破坏流程
- 在已经内置了回收的东西中运行它,例如IIS
- 在App.Config中设置jitdebug=true。这将防止触发内置的Windows窗体未经处理的异常处理程序
- 注册应用程序。ThreadException事件,例如在C#中: Application.ThreadException+=new Threading.ThreadExceptionHandler(CatchFatalException)
- 如果是Windows窗体应用程序,请在CatchFatalException事件处理程序中调用该方法
- 否则,您将需要对本机函数进行p/invoke。该链接讨论了Vista,但在我的测试中,它在XP上也可以正常工作
application.ThreadException+=MyHandler的操作代码>?是的,控制台应用程序也可以这样做。但它没有访问应用程序类的权限,是吗?如果添加正确的命名空间,它确实有访问应用程序类的权限。但在我的测试中,我看到一个“不受支持”的异常,所以你是对的,这不适用于控制台应用程序。我将改变我的答案以反映这一点。