Heim > Backend-Entwicklung > C++ > Warum bleibt WaitForexit bei der Umleitung der Standardausgabe mit großen Datenströmen?

Warum bleibt WaitForexit bei der Umleitung der Standardausgabe mit großen Datenströmen?

Susan Sarandon
Freigeben: 2025-01-29 20:42:09
Original
917 Leute haben es durchsucht

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

Das Problem des großen Datenstromstandsausgangs der großen Datenstreams, wenn die Ausgabe des großen Datenstreaming -Standards umgeleitet wird, wenn das Problem von WaitForexit

hängt Bei der Durchführung des Prozesses kann dies auf Probleme im Zusammenhang mit Einschränkungen mit

Puffer stoßen. Wenn der Abzug

, wenn die Ausgangsgröße einen bestimmten Schwellenwert (z. B. 7 MB) überschreitet, kann das Programm während der ProcessStartInfo -Präze zu einer unbestimmten Zeit aufgehängt werden. StandardOutput StandardOutput Der Grund WaitForExit

Wenn der abhängige und der interne Puffer voll sind, erfolgt dieses Verhalten. Wenn der Anrufvorgang vor dem Lesen von auf den Zielvorgang wartet, wird der Zielvorgang blockiert, wenn versucht wird, einen vollständigen Pufferbereich zu schreiben, um ihn vom Ende zu verhindern. Wenn der Anrufprozess Abrufausgabe verwendet, kann er blockiert, wenn der Zielprozess nicht ausgeschaltet wird (zum Beispiel, wenn er nicht endet oder sein -Stream blockiert ist), kann er blockiert werden.

Lösung StandardOutput StandardOutput ReadToEnd Um dieses Problem zu lösen, verwenden Sie asynchrone Lesen, um zu verhindern, dass der Puffer Kapazität erreicht. Das folgende Codebeispiel zeigt, wie diese Operation ausgeführt wird: StandardOutput StandardError

Diese Lösung verwendet einen asynchronen Rückruf, um Daten zu verarbeiten, die von

und empfangen werden, um sicherzustellen, dass die interne Pufferzone nicht voll ist und tote Schlösser verhindern.

Hinweis:

Um

zu vermeiden, wenn zum Zeitpunkt aufgetreten ist, überprüfen Sie die
<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>
Nach dem Login kopieren
Eigenschaft des Vorgangs vor der Ausgabe des Zugriffsprozesses oder des Fehlerflusses.

Das obige ist der detaillierte Inhalt vonWarum bleibt WaitForexit bei der Umleitung der Standardausgabe mit großen Datenströmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage