我將執行一個Process(lame.exe)來將WAV文件編碼爲MP3。如何在流程操作期間逐行捕獲流程STDOUT和STDERR。 (C#)
我想處理進程的STDOUT和STDERR以顯示進度信息。
我需要使用線程嗎?我無法理解它。
一些簡單的示例代碼將不勝感激。
感謝
我將執行一個Process(lame.exe)來將WAV文件編碼爲MP3。如何在流程操作期間逐行捕獲流程STDOUT和STDERR。 (C#)
我想處理進程的STDOUT和STDERR以顯示進度信息。
我需要使用線程嗎?我無法理解它。
一些簡單的示例代碼將不勝感激。
感謝
如果通過Process
類運行,您可以重定向數據流,因此您可以處理它們。您可以同步或異步地從stdout或stderr讀取。要啓用重定向,請爲要重定向的流設置適當的重定向屬性爲true
(例如,RedirectStandardOutput
),並將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);
}
這不捕獲STDERR。 – 2010-11-06 06:27:46
@Albin:很明顯,我沒有寫這個例子。 – 2010-11-06 06:41:19
你應該能夠聽STDOUT與Process.OutputDataReceived
事件。在MSDN頁面上有一個例子。 STDERR還有一個Process.ErrorDataReceived
事件。
有an MSDN example這...這是一個簡化版本:
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();
總是通過超時調用'waitForExit'來防止無限等待的機會。 'waitForExit(10000)'=>等待10秒鐘。 – 2017-09-04 08:46:39
我發現樣本[這裏](http://msdn.microsoft.com/en-us/library/system。 diagnostics.process%28v = vs80%29.aspx),它顯示瞭如何使用有幫助的線程讀取stdout和stderr。另請參閱http://cleancode.sourceforge.net/api/csharp/html/T_CleanCode_IO_ExecProcess.htm。 – 2012-03-08 18:44:55