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
Patricia ArquetteOriginal
2025-01-29 20:21:12368Durchsuche

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:

<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>

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!

Stellungnahme:
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