Пересмотреть ответ из командной строки - PullRequest
2 голосов
/ 08 августа 2011

Я кодирую видео с помощью приложения командной строки. Приложение возвращает строку, которая говорит:

% выполнено: 34%

Это обновляется при кодировании медиа. Есть ли способ, используя класс процесса, чтобы продолжать проверять стандартный вывод и передавать его обратно в основной сценарий выполнения? У меня есть класс, который запускает процесс, а затем записывает стандартный вывод в stringbuilder, но я хочу знать, как продолжать его проверять. Это текущий код ...

public static Dictionary<string, string> StartProcess(string exePathArg, string argumentsArg, int timeToWaitForProcessToExit)
    {
        //the dictionary with the
        Dictionary<string, string> retDirects = new Dictionary<string, string>();

        using (Process p = new Process())
        {
            p.StartInfo.FileName = exePathArg;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.Arguments = argumentsArg;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;

            try
            {

                p.Start();

                p.WaitForExit(timeToWaitForProcessToExit);

                int exitCode;
                try
                {
                    exitCode = p.ExitCode;

                    StreamReader standardOutput = p.StandardOutput;
                    StreamReader standardError = p.StandardError;

                    retDirects.Add("StandardOutput", standardOutput.ReadToEnd());
                    retDirects.Add("StandardError", standardError.ReadToEnd());
                }
                catch { }


            }
            catch { }
            finally
            {
                try
                {
                    p.Kill();
                    p.CloseMainWindow();
                }
                catch { }
            }
        }

        return retDirects;
    }

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Вместо использования «ReadToEnd» используйте «Чтение» нескольких байтов (даже одного байта за раз) в цикле.Чтение будет блокироваться до тех пор, пока не будет прочитано указанное количество байтов.Найдите правильное количество байтов, и вы сможете прочитать строки из стандартного вывода.

0 голосов
/ 08 августа 2011

Вы можете использовать Process.BeginOutputReadLine для запуска события Process.OutputDataRecieved. UseShellExecute должно быть false и Redirect<StreamOfChoice>Output должно быть true, как в вашем примере кода.

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

...