Подтвердить что ты не робот

Как фиксировать процессы STDOUT и STDERR по очереди, когда они происходят, во время процесса. (С#)

Я собираюсь выполнить Process (lame.exe), чтобы закодировать WAV файл в MP3.

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

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

Какой-то простой примерный код будет оценен.

Спасибо

4b9b3361

Ответ 1

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

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

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);
}

Ответ 2

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

Ответ 3

Для этого есть пример 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 comment

StdOut = stdout.ToString();
StdErr = stderr.ToString();