Как захватывать процессы STDOUT и STDERR построчно, как они происходят, во время работы процесса.(С #) - PullRequest
16 голосов
/ 06 ноября 2010

Я собираюсь выполнить процесс (lame.exe) для кодирования файла WAV в MP3.

Я хочу обработать STDOUT и STDERR процесса для отображения информации о ходе выполнения.

Нужно ли использовать потоки?Я не могу разобраться с этим.

Был бы признателен за простой пример кода.

Спасибо

Ответы [ 3 ]

8 голосов
/ 06 ноября 2010

При запуске через класс Process вы можете перенаправить потоки, чтобы обрабатывать их.Вы можете читать из stdout или stderr синхронно или асинхронно.Чтобы включить перенаправление, установите соответствующие свойства перенаправления на true для потоков, которые вы хотите перенаправить (например, RedirectStandardOutput), и установите UseShellExecute на false.Тогда вы можете просто запустить процесс и читать из потоков.Вы также можете передавать ввод данных перенаправляя стандартный ввод.

например, обрабатывать и печатать все, что процесс записывает в стандартный вывод синхронно

var proc = new Process()
{
    StartInfo = new ProcessStartInfo(@"SomeProcess.exe")
    {
        RedirectStandardOutput = true,
        UseShellExecute = false,
    }
};
if (!proc.Start())
{
    // handle error
}
var stdout = proc.StandardOutput;
string line;
while ((line = stdout.ReadLine()) != null)
{
    // process and print
    Process(line);
    Console.WriteLine(line);
}
5 голосов
/ 06 ноября 2010

Вы должны быть в состоянии слушать STDOUT с событием Process.OutputDataReceived.На странице MSDN есть пример.Для STDERR также существует событие Process.ErrorDataReceived.

3 голосов
/ 16 августа 2017

Для этого есть пример MSDN ... Вот упрощенная версия:

var StdOut = "";
var StdErr = "";

var stdout = new StringBuilder();
var stderr = new StringBuilder();

var psi = new ProcessStartInfo();
psi.FileName = @"something.exe";
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;

var proc = new Process();
proc.StartInfo = psi;
proc.OutputDataReceived += (sender, e) => { stdout.AppendLine(e.Data); };
proc.ErrorDataReceived += (sender, e) => { stderr.AppendLine(e.Data); };
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
proc.WaitForExit(10000); // per sachin-joseph's comment

StdOut = stdout.ToString();
StdErr = stderr.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...