如何在进程操作期间逐行捕获进程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();