解決 ProcessStartInfo.WaitForExit() 在重定向標準輸出或標準錯誤時卡住的問題
當通過 ProcessStartInfo 重定向 StandardOutput 或 StandardError 時,可能會出現問題。內部緩衝區可能會溢出,導致潛在的死鎖或阻塞您的進程。
為了防止此類死鎖並從兩個流中收集輸出,請考慮使用以下異步讀取方法:
<code class="language-csharp">using System.Diagnostics; using System.Text; using System.Threading; class Program { static void Main(string[] args) { string filename = "TheProgram.exe"; string arguments = "some arguments"; int timeout = 10000; // 10 秒超时 using (Process process = new Process()) { process.StartInfo.FileName = filename; process.StartInfo.Arguments = arguments; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; StringBuilder output = new StringBuilder(); StringBuilder error = new StringBuilder(); using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false)) using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false)) { process.OutputDataReceived += (sender, e) => { if (e.Data == null) { outputWaitHandle.Set(); } else { output.AppendLine(e.Data); } }; process.ErrorDataReceived += (sender, e) => { if (e.Data == null) { errorWaitHandle.Set(); } else { error.AppendLine(e.Data); } }; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); if (process.WaitForExit(timeout) && outputWaitHandle.WaitOne(timeout) && errorWaitHandle.WaitOne(timeout)) { // 进程成功完成。在此处检查 process.ExitCode。 Console.WriteLine($"输出: {output}"); Console.WriteLine($"错误: {error}"); //添加错误输出 } else { // 超时或发生错误。 Console.WriteLine("进程超时或失败。"); } } } } }</code>
這種異步方法確保緩衝區不會溢出,防止系統凍結。現在,您可以讀取和收集輸出,而無需擔心延遲或潛在的死鎖。 代碼已改進,包含了錯誤輸出的處理。
以上是為什麼processstartinfo.waitforexit()在重定向標準輸出或標准設備時會拖延?的詳細內容。更多資訊請關注PHP中文網其他相關文章!