【问题标题】:How to know that Process has crashed如何知道进程已经崩溃
【发布时间】:2012-02-03 16:12:18
【问题描述】:

在我的控制台应用程序中,我的代码看起来像

    Process DKU = new Process();
    DKU.StartInfo.FileName = "MSSQLExecutor.exe";
    DKU.Start();
    DKU.WaitForExit();
    Console.WriteLine("lets move on ");

这工作正常,它会等到 MSSQLExecutor.exe 完成它的工作,然后再 应用程序继续。

我的问题是,有时 MSSQLExecutor.exe 会崩溃,Windows 默认会显示一个结束程序的对话框。那时我的应用程序将永远等待用户单击关闭按钮。

我想避免这种情况,因为我的应用程序将在没有用户交互的情况下作为服务运行。

【问题讨论】:

  • MSSQLExecutor 是您的应用程序吗?如果是这样,我建议修复崩溃的原因,而不是隐藏问题。
  • @DBM 不幸的是,不,SQLExecutor 不是我的应用程序,我无法修复它。
  • 您能联系供应商并告诉他们修复损坏的应用程序吗?
  • 你能用PTFB之类的东西吗?
  • @adopilot 然后您可以禁用 Dr. Watson。看看我的回答。我们遇到了同样的问题。

标签: c# debugging console


【解决方案1】:

对话框阻止进程存在。

  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

    博士。 Watson 是 Microsoft Windows 操作系统中包含的应用程序调试器。

    • 单击“开始”,单击“运行”,在“打开”框中键入 regedit.exe,然后单击“确定”。
    • 找到并单击以下注册表项:
      HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug
    • 单击 AeDebug 键,然后单击注册表菜单上的导出注册表文件。
    • 删除 AeDebug 键。

更多信息

【讨论】:

  • 有趣。如果 Watson 博士没有启用,进程会像往常一样终止吗?这是否意味着 Process.WaitForExit() 将停止阻塞?
  • 仅供参考,我正在调查这是否能解决我遇到的问题;它看起来确实像。有关 Dr. Watson 的其他信息,包括看起来比删除注册表项更安全的禁用方法:techdows.com/2009/03/…ccm.net/faq/6610-how-to-delete-disable-dr-watson-debugger
  • @dknaack 我应该将此代码放入Program.cs 还是我的每个表单都不会在客户的系统上崩溃?
【解决方案2】:

这是在进程外运行的常见问题。从here 我建议为此应用程序设置一个最大超时值。

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 ");

【讨论】:

    【解决方案3】:

    相关:Detecting process crash in .NET

    此外,如果您只想等待很长时间以完成该过程,您可以致电 Process.Kill

    【讨论】:

      【解决方案4】:

      如果您不想阻止等待进程结束,请不要调用 Process.WaitForExit()。这样做的目的是什么?如果您只需要知道它何时完成,请注册 Process.Exited 事件。在 Process.Exited 事件中,您可以查看 Process.ExitCode 以了解它是否因崩溃而结束。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-02
        • 1970-01-01
        • 2012-10-08
        • 2018-12-26
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 2012-03-17
        相关资源
        最近更新 更多