Как я могу узнать, когда.Net System.Diagnostics.Process успешно запущен или не работает?

Я пишу планировщик или сортирует. В основном это таблица со списком exes (например, "C:\a.exe") и консольное приложение, которое каждую минуту просматривает записи в таблице и запускает задачи, которые еще не выполнялись.

Я запускаю такие задачи:

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = someExe; // like "a.exe"
p.Start();

Как я могу определить, что конкретная задача не удалась? Например, что если a.exe выдает необработанное исключение? Я хотел бы, чтобы приведенный выше код знал, когда это происходит, и обновил таблицу задач примерно так: "конкретная задача не выполнена" и т. Д.

Как я могу это сделать?

Я не использую Агент Sql или Планировщик Windows, потому что кто-то еще сказал мне не делать этого. У него больше "опыта", поэтому я в основном просто следую приказам. Не стесняйтесь предлагать альтернативы.

4 ответа

Решение

Вы можете перехватить Win32Exception, чтобы проверить, не удалось ли Process.Start() из-за того, что файл не существует или доступ к исполнению запрещен.

Но вы не можете отловить исключения, создаваемые процессами, которые вы создаете с помощью этого класса. Во-первых, приложение может быть написано не на.NET, поэтому концепция исключения может вообще отсутствовать.

Что вы можете сделать, это проверить ExitCode приложения или прочитать потоки StandardOutput и StandardError, чтобы проверить, публикуются ли сообщения об ошибках.

Я думаю, что вы ищете Process.ExitCode, предполагая, что процесс возвращает один. Возможно, вам придется использовать WaitForExit(), хотя. Существует также событие ErrorDataReceived, которое запускается, когда приложение отправляет в stderr.

В дополнение к ExitCode вы также можете сделать что-то вроде этого:

string output = p.StandardOutput.ReadToEnd();

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

Подробнее о том, что сказал @jop. Вам также нужно будет дождаться закрытия процесса. Таким образом:

        p.Start();
        p.WaitForExit();
        int returnCode = p.ExitCode;

Ненулевые коды обычно являются ошибками. Некоторые приложения используют отрицательные ошибки, а положительные - коды состояния / предупреждения.

Другие вопросы по тегам