如何知道Process崩溃了
在我的控制台应用程序中,我有代码看起来像
Process DKU = new Process(); DKU.StartInfo.FileName = "MSSQLExecutor.exe"; DKU.Start(); DKU.WaitForExit(); Console.WriteLine("lets move on ");
这工作正常,它等待MSSQLExecutor.exe完成其工作,然后应用程序继续。
我的问题是,有时MSSQLExecutor.exe崩溃,Windows默认显示一个用于结束程序的对话框。 此时,我的应用程序将永远等待用户单击“关闭”按钮。
我想避免这种情况,因为我的应用程序将在没有用户交互的情况下作为服务运行。
Dialog可以防止进程存在。
-
如果
MSSQLExecutor
是您的应用程序,您应该解决问题。 但是你可以达到目标(隐藏对话框)。 处理Application.ThreadException
和AppDomain.CurrentDomain.UnhandledException
Application.ThreadException +=new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { // log the exception } static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { // log the exception }
-
如果
MSSQLExecutor
不是您的应用程序,您可以停用Dr. WatsonDr. Watson是Microsoft Windows操作系统附带的应用程序调试程序。
- 单击“开始”,单击“运行”,在“打开”框中键入regedit.exe,然后单击“确定”。
- 找到并单击以下注册表项:
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug - 单击AeDebug项,然后单击注册表菜单上的导出注册表文件。
- 删除AeDebug键。
更多信息
- 如何禁用或启用Dr.Watson for Windows
这是在外部进程中运行的常见问题。 从这里我建议为此应用程序设置最大超时值。
Process DKU = new Process(); DKU.StartInfo.FileName = "MSSQLExecutor.exe"; DKU.Start(); DKU.WaitForExit(10*60*1000); if (!DKU.HasExited) DKU.Kill(); Console.WriteLine("lets move on ");
Relevent: 检测.NET中的进程崩溃
此外,如果您只想等待这个过程完成,您可以调用Process.Kill 。
如果您不想阻止等待进程结束,请不要调用Process.WaitForExit()。 这样做的目的是什么? 如果您只需要知道它何时完成,请注册Process.Exited事件。 在Process.Exited事件中,您可以检查Process.ExitCode以了解它是否因崩溃而结束。