Masalah output standard aliran data besar apabila output standard streaming data besar diarahkan apabila masalah yang digantung oleh Waitforexit
Apabila melakukan proses, ia mungkin menghadapi isu -isu yang berkaitan dengan sekatan dengan penampan
. Khususnya, apabila potongan, jika saiz output melebihi ambang tertentu (seperti 7MB), program itu boleh digantung pada masa yang tidak terbatas dalam tempoh ProcessStartInfo
. StandardOutput
StandardOutput
Sebab WaitForExit
Apabila tanggungan dan penampan dalaman penuh, tingkah laku ini akan berlaku. Jika proses panggilan sedang menunggu proses sasaran sebelum membaca , proses sasaran akan disekat ketika cuba menulis kawasan penampan penuh untuk mencegahnya dari akhir. Sebaliknya, jika proses panggilan menggunakan output pengambilan , jika proses sasaran tidak dimatikan (contohnya, jika ia tidak berakhir atau aliran
disekat), ia mungkin disekat.
StandardOutput
penyelesaian StandardOutput
ReadToEnd
StandardOutput
Untuk menyelesaikan masalah ini, gunakan bacaan tak segerak untuk mengelakkan penampan daripada mencapai kapasiti. Contoh kod berikut menunjukkan cara melaksanakan operasi ini: StandardError
Penyelesaian ini menggunakan panggilan balik tak segerak untuk memproses data yang diterima dari dan untuk memastikan bahawa zon penampan dalaman tidak akan penuh dan menghalang kunci mati.
<:> NOTA:
Untuk mengelakkan<code class="language-csharp">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。 } else { // 超时。 } } }</code>
proses sebelum output proses akses atau aliran ralat. StandardOutput
Atas ialah kandungan terperinci Mengapa Waitforexit gerai apabila mengalihkan output standard dengan aliran data yang besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!