Rumah > pembangunan bahagian belakang > C++ > Kenapa `ProcessStartInfo.waitForExit ()` Hang dengan StandardOutput yang besar, dan bagaimana saya boleh memperbaikinya?

Kenapa `ProcessStartInfo.waitForExit ()` Hang dengan StandardOutput yang besar, dan bagaimana saya boleh memperbaikinya?

Patricia Arquette
Lepaskan: 2025-01-29 20:21:12
asal
337 orang telah melayarinya

Why Does `ProcessStartInfo.WaitForExit()` Hang with Large StandardOutput, and How Can I Fix It?

Penyelesaian masalah hang dengan output besar ProcessStartInfo.WaitForExit()

Apabila bekerja dengan

dalam .net, aliran output standard yang besar (mis., 7MB atau lebih) boleh menyebabkan ProcessStartInfo hang selama -lamanya. Ini kerana saiz penampan lalai untuk output standard adalah terhad. Untuk menyelesaikannya, bacaan tak segerak diperlukan untuk mengelakkan limpahan penampan. WaitForExit()

Kod yang lebih baik akan mengalihkan kedua -dua

dan StandardOutput, menggunakan bacaan tak segerak untuk mengendalikan aliran output yang berpotensi besar dengan cekap: StandardError

<code class="language-csharp">using (Process process = new Process())
{
    // Process configuration...

    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(); // Signal completion of output stream
            }
            else
            {
                output.AppendLine(e.Data);
            }
        };

        process.ErrorDataReceived += (sender, e) =>
        {
            if (e.Data == null)
            {
                errorWaitHandle.Set(); // Signal completion of error stream
            }
            else
            {
                error.AppendLine(e.Data);
            }
        };

        process.Start();
        process.BeginOutputReadLine();
        process.BeginErrorReadLine();

        // Use a timeout to prevent indefinite waiting
        int timeoutMilliseconds = 10000; // Example: 10-second timeout

        if (process.WaitForExit(timeoutMilliseconds) &&
            outputWaitHandle.WaitOne(timeoutMilliseconds) &&
            errorWaitHandle.WaitOne(timeoutMilliseconds))
        {
            // Process completed successfully within the timeout.
            Console.WriteLine("Output:\n" + output.ToString());
            Console.WriteLine("\nError:\n" + error.ToString());
        }
        else
        {
            // Timed out.  Handle the timeout appropriately.
            Console.WriteLine("Process timed out.");
            process.Kill(); // Consider killing the process if it's unresponsive
        }
    }
}</code>
Salin selepas log masuk
Penyelesaian ini menggunakan

untuk memberi isyarat apabila aliran output dan ralat telah dibaca sepenuhnya, menghalang benang utama daripada menyekat selama -lamanya. Penambahan waktu menyediakan satu mekanisme untuk mengendalikan situasi di mana proses itu mungkin tidak lengkap dalam jangka masa yang munasabah. Ingatlah untuk mengendalikan kes masa tamat, berpotensi membunuh proses untuk mengelakkan kebocoran sumber. AutoResetEvent

Atas ialah kandungan terperinci Kenapa `ProcessStartInfo.waitForExit ()` Hang dengan StandardOutput yang besar, dan bagaimana saya boleh memperbaikinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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