如何知道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可以防止进程存在。

  1. 如果MSSQLExecutor是您的应用程序,您应该解决问题。 但是你可以达到目标(隐藏对话框)。 处理Application.ThreadExceptionAppDomain.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 } 
  2. 如果MSSQLExecutor不是您的应用程序,您可以停用Dr. Watson

    Dr. 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以了解它是否因崩溃而结束。