menyelesaikan masalah yang prosesStartInfo.waitForExit () terjebak apabila output regattcing atau kesilapan standard standard
Apabila ProcessStartInfo mengalihkan ke StandardOutput atau StandardError, mungkin ada masalah. Penampan dalaman mungkin melimpah, yang membawa kepada potensi yang berpotensi atau menghalang proses anda.
Untuk mengelakkan kebuntuan sedemikian dan kumpulkan output dari dua aliran, pertimbangkan untuk menggunakan kaedah bacaan tak segerak berikut:
kaedah asynchronous ini memastikan bahawa penampan tidak akan melimpah dan mencegah sistem dari pembekuan. Sekarang anda boleh membaca dan mengumpulkan output tanpa bimbang tentang kunci tertunda atau berpotensi mati. Kod ini telah diperbaiki dan termasuk pemprosesan output ralat.
<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>
Atas ialah kandungan terperinci Kenapa ProcessStartInfo.WaitForExit () gerai ketika mengalihkan StandardOutput atau StandardError?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!