如何在进程操作期间逐行捕获进程STDOUT和STDERR。 (C#)

我将执行一个进程(lame.exe)将WAV文件编码为MP3。

我想处理进程的STDOUT和STDERR以显示进度信息。

我需要使用线程吗? 我无法理解它。

一些简单的示例代码将不胜感激。

谢谢

如果通过Process类运行,则可以重定向流以便处理它们。 您可以同步或异步读取stdout或stderr。 要启用重定向,请为要重定向的流(例如, RedirectStandardOutput )将相应的重定向属性设置为true ,并将UseShellExecute设置为false 。 然后,您可以启动该过程并从流中读取。 您还可以输入重定向标准输入的输入。

例如,处理并打印进程同步写入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); } 

您应该能够使用Process.OutputDataReceived事件侦听STDOUT。 MSDN页面上有一个示例。 STDERR还有一个Process.ErrorDataReceived事件。

有一个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();