C # Process.exited не вызывается, пока после закрытия окна - PullRequest
5 голосов
/ 07 марта 2012

Итак, я пишу приложение, которое отслеживает консольное приложение, написанное другим разработчиком. Консольное приложение подвержено сбоям, и, поскольку оно работает всю ночь, мне нужно мое приложение, чтобы перезапустить его.

К сожалению, когда консольное приложение дает сбой, я получаю сообщение Windows с надписью «бла перестал работать» и кнопку с надписью закрыть программу.

Я использую System.Diagnostic.Process для запуска консольного приложения, но не могу определить, произошло ли сбой консольного приложения, пока ПОСЛЕ нажатия кнопки закрытия программы. Process.Responding всегда имеет значение true (дескриптор окна отсутствует). Process.exited не запускается до тех пор, пока не будет нажата кнопка закрытия программы.

Любые идеи были бы очень полезны.

Спасибо

Ответы [ 5 ]

2 голосов
/ 30 августа 2012

Посмотрите на ProcessStartInfo.ErrorDialog = false;

2 голосов
/ 07 марта 2012

Отключить функцию отчетов о сбоях Windows. Он получает уведомление от ядра при сбое процесса. Процесс активен до тех пор, пока с ним не будет завершено создание отчетов о сбоях.

Эта функция может быть отключена для каждого процесса с использованием некоторого API. Отключение отчетов об ошибках Windows (Dr. Watson) для моего процесса Не отключайте его глобально, чтобы устранить локальную проблему.

0 голосов
/ 26 февраля 2013

Мне кажется, это работает:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo();
startinfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startinfo.FileName = @"PATH TO EXE";
startinfo.Arguments = "Arg1 Arg2 Arg3";
startinfo.ErrorDialog = false;
startinfo.RedirectStandardError = true;
startinfo.UseShellExecute = false;
process.StartInfo = startinfo;           
process.Start();
process.WaitForExit();
process.Kill();
0 голосов
/ 07 марта 2012

Я не знаю ни одного встроенного метода для обработки этого .. но вы могли бы написать отладчик в свой сторожевой таймер: http://www.codeproject.com/Articles/5275/Writing-a-Debugger-Part-2-The-Debug-Loop

0 голосов
/ 07 марта 2012
  1. это не хороший случай для консольного приложения.Лучше всего подойдет служба Windows или запланированное задание .

  2. ваше консольное приложение вылетает, потому что у вас нет обработка ошибок

  3. как сказал другой человек, ваш процесс зависает сообщения об ошибках Windows

Если вам нужен мой совет, исходя из небольшой информации, которая у меня есть, я предполагаю, что имеет таким, какой он есть сейчас, поэтому оберните весь процесс в try /перехватить и обработать исключение в блоке catch, чтобы оно не всплывало в сообщениях об ошибках Windows.Затем отзовите перезагрузку.

Редактировать: человек получил достаточный ответ, но я оставляю это на усмотрение Google.Хочу заметить, что приложение-обертка никогда не получит контроль над сбоем процесса без отключения сообщений об ошибках Windows, так что это важный шаг в процессе.

...