Rumah > pembangunan bahagian belakang > C++ > Kenapa `Waitforexit` menggantung apabila proses menjana output yang besar?

Kenapa `Waitforexit` menggantung apabila proses menjana output yang besar?

Mary-Kate Olsen
Lepaskan: 2025-01-29 20:16:10
asal
589 orang telah melayarinya

Why Does `WaitForExit` Hang When a Process Generates Large Output?

Penyelesaian masalah hang dengan output yang berlimpah ProcessStartInfo

Artikel ini menangani masalah biasa:

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>
Salin selepas log masuk
Kod yang disemak ini menggunakan pengendali peristiwa tak segerak (

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan