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

Я пишу планировщик или сортирует. В основном это таблица со списком 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 Agent или планировщик Windows, потому что кто-то другой сказал мне не делать этого. У него больше «опыта», поэтому я в основном просто выполняю приказы. Не стесняйтесь предлагать альтернативы.

Ответы [ 4 ]

8 голосов
/ 01 октября 2008

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

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

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

5 голосов
/ 01 октября 2008

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

2 голосов
/ 01 октября 2008

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

string output = p.StandardOutput.ReadToEnd();

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

0 голосов
/ 01 октября 2008

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

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

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

...