Как узнать, что процесс потерпел крах - PullRequest
9 голосов
/ 03 февраля 2012

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

    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 ]

7 голосов
/ 03 февраля 2012

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

  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 не является вашим заявлением, вы можете деактивировать Dr. Watson

    Dr. Watson - это отладчик приложений, включенный в операционную систему Microsoft Windows.

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

Больше информации

5 голосов
/ 03 февраля 2012

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

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 ");
1 голос
/ 03 февраля 2012

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

Кроме того, вы можете вызвать Process.Kill , если вы только хотели так долго ждать завершения процесса.

0 голосов
/ 03 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...