Penyelesaian masalah hang dengan output yang berlimpah ProcessStartInfo
tergantung selama -lamanya apabila proses menghasilkan jumlah output yang besar menggunakan WaitForExit
. Ini berlaku kerana penampan dalaman ProcessStartInfo
untuk mengalihkan output standard dan aliran ralat mempunyai batasan saiz. Menunggu proses keluar sebelum membaca output boleh menyebabkan kebuntuan; Proses menghalang penulisan ke penampan penuh, menghalangnya daripada keluar. Begitu juga, menggunakan ProcessStartInfo
boleh menyekat jika proses tidak menutup atau menemui kesilapan menulis ke ReadToEnd
. StandardError
Penyelesaian: bacaan asynchronous
Kunci untuk menyelesaikan ini adalah bacaan tak segerak. Kod berikut menunjukkan pendekatan yang lebih baik ini, mengendalikan kedua -dua dan StandardOutput
dengan cekap: 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>
dan OutputDataReceived
) untuk memproses aliran output dan ralat serentak, mencegah menyekat. ErrorDataReceived
Isyarat digunakan untuk menunjukkan apabila setiap aliran selesai. Masa tamat dimasukkan ke dalam AutoResetEvent
dan WaitForExit
untuk mengelakkan hang tidak terbatas. Ini memastikan pengendalian aliran output yang besar. WaitOne
Atas ialah kandungan terperinci Kenapa `Waitforexit` menggantung apabila proses menjana output yang besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!