Как узнать, что процесс завис

в моем консольном приложении у меня есть код, который выглядит как

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

это работает нормально, и он ждет, пока MSSQLExecutor.exe завершает свою работу, а затем после этого приложение продолжается.

моя проблема в том, что иногда MSSQLExecutor.exe сбои и Windows по умолчанию показывает диалоговое окно для завершения программы. В этот момент мое приложение будет ждать вечно для пользователя, чтобы нажать кнопку Закрыть.

Я хочу избежать этого, потому что мое приложение будет Запуск от имени службы без взаимодействия с пользователем.

After This I wanna to move on whit my app

4 ответов


диалоговое окно предотвращает существование процесса.

  1. если 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
    }
    
  2. если MSSQLExecutor это не ваше приложение вы можете отключить Доктор Ватсон

    "Доктор Ватсон" представляет собой отладчик приложений, входящих в состав Microsoft Windows операционной система.

    • Нажмите кнопку Пуск, нажмите кнопку Выполнить, введите regedit.exe в поле Открыть и нажмите кнопку ОК.
    • найдите и выберите следующий раздел реестра:
      Раздел HKEY_LOCAL_MACHINE\программное обеспечение\Майкрософт\Windows в НТ\раздел CurrentVersion\AeDebug
    • нажмите клавишу AeDebug, а затем выберите Экспорт файла реестра в меню реестр.
    • удалить ключ AeDebug.

больше Подробная информация


Это частая проблема, запущенная вне процессов. От здесь Я бы предложил установить максимальное значение тайм-аута для этого приложения.

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

уместное: обнаружение сбоя процесса в .NET

кроме того, вы можете позвонить


Если вы не хотите блокировать ожидание завершения процесса, не вызывайте процесс.WaitForExit(). Какова цель этого? Если вам просто нужно знать, когда он закончится, зарегистрируйтесь на процесс.События exited. в этом процессе.Событие Exited, вы можете проверить процесс.ExitCode, чтобы узнать, закончилось ли это из-за сбоя или нет.