Heim > Backend-Entwicklung > C++ > Warum hängt `ProcessStartinfo.waitforexit ()` mit großem StandardOutput und wie kann ich es beheben?

Warum hängt `ProcessStartinfo.waitforexit ()` mit großem StandardOutput und wie kann ich es beheben?

Patricia Arquette
Freigeben: 2025-01-29 20:21:12
Original
387 Leute haben es durchsucht

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

Fehlerbehebung ProcessStartInfo.WaitForExit() hängt mit großer Ausgabe

Bei der Arbeit mit ProcessStartInfo in .NET kann ein großer Standardausgangsstrom (z. B. 7 MB oder mehr) dazu führen, dass WaitForExit() unbegrenzt hängen. Dies liegt daran, dass die Standardpuffergröße für die Standardausgabe begrenzt ist. Um dies zu lösen, ist eine asynchrone Lektüre erforderlich, um Pufferüberläufe zu verhindern.

Der folgende verbesserte Code leitet sowohl StandardOutput als auch StandardError unter Verwendung asynchroner Lesevorgänge um, um potenziell große Ausgangsströme effizient zu verarbeiten:

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
        }
    }
}
Nach dem Login kopieren

Diese Lösung verwendet AutoResetEvent, um zu signalisieren, wenn die Ausgabe- und Fehlerströme vollständig gelesen wurden, wodurch verhindert wird, dass der Hauptfaden unbegrenzt blockiert. Das Hinzufügen eines Zeitlimits bietet einen Mechanismus, um Situationen zu bewältigen, in denen der Prozess möglicherweise nicht innerhalb eines angemessenen Zeitrahmens abgeschlossen ist. Denken Sie daran, den Zeitüberschreitungsfall angemessen zu bewältigen, um den Prozess möglicherweise zu töten, um Ressourcenlecks zu vermeiden.

Das obige ist der detaillierte Inhalt vonWarum hängt `ProcessStartinfo.waitforexit ()` mit großem StandardOutput und wie kann ich es beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage