所以我正在编写一个监视由另一个开发人员编写的控制台应用程序的应用程序。控制台应用程序容易崩溃,因为它运行一整晚我需要我的应用程序重新启动它。
不幸的是,当控制台应用程序崩溃时,我收到的消息显示“blah已停止工作”以及一个显示关闭程序的按钮。
我正在使用System.Diagnostic.Process来启动控制台应用程序但我无法确定控制台应用程序是否已崩溃,直到命中关闭程序按钮为止。 Process.Responding始终为true(没有窗口句柄)Process.exited在触发关闭程序按钮之前不会被触发。
任何想法都会非常有用。
由于
答案 0 :(得分:2)
禁用Windows崩溃报告功能。当进程失败时,内核会通知它。这个过程一直存在,直到崩溃报告内容完成。
可以使用某些API为每个进程禁用该功能。 Disabling Windows error reporting (Dr. Watson) for my process不要全局禁用它来修复本地问题。
答案 1 :(得分:2)
查看ProcessStartInfo.ErrorDialog = false;
答案 2 :(得分:0)
对于控制台应用来说,这不是一个好例子。 windows service或scheduled task会更合适。
您的控制台应用程序崩溃,因为您没有任何error handling
正如另一个人所说,您的流程被windows error reporting
如果你需要我的建议,继续使用我所掌握的小信息,我会假设已经成为现在的样子,所以将整个过程包装在尝试中/ catch 并处理catch
块中的异常,因此它不会冒泡到窗口错误报告。然后从那里调用重启。
编辑:这个人得到了足够的答案,但我将其留给了谷歌。我想要注意的是,如果没有关闭 windows错误报告,包装应用程序将无法控制进程崩溃,因此这是该过程中的重要步骤。
答案 3 :(得分:0)
我不知道有任何内置的处理方法..但你可以在看门狗中写一个调试器:http://www.codeproject.com/Articles/5275/Writing-a-Debugger-Part-2-The-Debug-Loop
答案 4 :(得分:0)
这似乎对我有用:
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo();
startinfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startinfo.FileName = @"PATH TO EXE";
startinfo.Arguments = "Arg1 Arg2 Arg3";
startinfo.ErrorDialog = false;
startinfo.RedirectStandardError = true;
startinfo.UseShellExecute = false;
process.StartInfo = startinfo;
process.Start();
process.WaitForExit();
process.Kill();