简体   繁体   中英

How to know that Process has crashed

In my console application I have code which looks like

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

This is working fine and it waits until MSSQLExecutor.exe finishes its job, then after that the app continues.

My problem is that sometimes MSSQLExecutor.exe crashes and Windows by default shows a dialog for ending the program. At that point my application will wait forever for the user to click the Close button.

I want to avoid this because MY application is going to run as a service without user interaction.

在此之后,我想继续我的应用程序

The Dialog prevents that the process exists.

  1. If MSSQLExecutor is your Application you should fix the problem. But you can reach the goal (hiding the Dialog). Handle Application.ThreadException and 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 } 
  2. If MSSQLExecutor is not your Application you can deactivate Dr. Watson

    Dr. Watson is an application debugger included with the Microsoft Windows operating system.

    • Click Start, click Run, type regedit.exe in the Open box, and then click OK.
    • Locate and then click the following registry key:
      HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug
    • Click the AeDebug key, and then click Export Registry File on the Registry menu.
    • Delete the AeDebug key.

More Infromation

This is a frequent problem running outside processes. From here I would suggest setting a maximum timeout value for this application.

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: Detecting process crash in .NET

Also, you could call Process.Kill if you only wanted to wait so long for the process to finish.

If you don't want to block waiting for the process to end, don't call Process.WaitForExit(). What's the goal of doing that? If you just need to know when it finishes, register for the Process.Exited event. In the Process.Exited event, you can check the Process.ExitCode to know whether it ended because of a crash or not.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM