> 故障排除ProcessStartInfo
懸掛著豐富的輸出
>本文解決了一個常見的問題:WaitForExit
使用ProcessStartInfo
生成大量輸出時,無限期地懸掛。之所以發生這種情況,是因為用於重定向標準輸出和錯誤流的內部緩衝區具有大小限制。 在閱讀輸出之前等待流程出口會導致僵局;該過程會阻止寫入完整的緩衝區,從而阻止其退出。 同樣,如果該過程未關閉或遇到寫入ProcessStartInfo
ReadToEnd
解決方案:異步讀取StandardError
解決此問題的關鍵是異步閱讀。 以下代碼證明了這種改進的方法,同時處理>>>>>>>
此修訂的代碼使用異步事件處理程序(StandardOutput
和StandardError
)同時處理輸出和錯誤流,從而防止阻塞。
<code class="language-csharp">using System.Diagnostics; using System.Text; using System.Threading; using System.Threading.Tasks; // ... other using statements ... Process process = new Process(); process.StartInfo.FileName = "TheProgram.exe"; process.StartInfo.Arguments = "Your arguments"; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; StringBuilder outputBuffer = new StringBuilder(); StringBuilder errorBuffer = new StringBuilder(); AutoResetEvent outputWaitHandle = new AutoResetEvent(false); AutoResetEvent errorWaitHandle = new AutoResetEvent(false); process.OutputDataReceived += (sender, e) => { if (e.Data == null) { outputWaitHandle.Set(); // Signal completion of output stream } else { outputBuffer.AppendLine(e.Data); } }; process.ErrorDataReceived += (sender, e) => { if (e.Data == null) { errorWaitHandle.Set(); // Signal completion of error stream } else { errorBuffer.AppendLine(e.Data); } }; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); // Wait for process exit and data streams with timeout if (process.WaitForExit(30000) && outputWaitHandle.WaitOne(30000) && errorWaitHandle.WaitOne(30000)) { Console.WriteLine("Process completed successfully."); Console.WriteLine("Standard Output:\n" + outputBuffer.ToString()); Console.WriteLine("\nStandard Error:\n" + errorBuffer.ToString()); } else { Console.WriteLine("Process timed out."); } // ... rest of your code ...</code>
中包含一個超時,以防止無限期懸掛。 這樣可以確保對大型輸出流的強大處理。 OutputDataReceived
以上是當一個過程產生大輸出時,為什麼``wareforexit'''懸掛?的詳細內容。更多資訊請關注PHP中文網其他相關文章!