Rumah > pembangunan bahagian belakang > C++ > Mengapa Waitforexit gerai apabila mengalihkan output standard dengan aliran data yang besar?

Mengapa Waitforexit gerai apabila mengalihkan output standard dengan aliran data yang besar?

Susan Sarandon
Lepaskan: 2025-01-29 20:42:09
asal
915 orang telah melayarinya

Why Does WaitForExit Stall When Redirecting Standard Output with Large Data Streams?

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>
Salin selepas log masuk
apabila berlaku pada masa, periksa sifat

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!

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