Heim >Backend-Entwicklung >C++ >Warum ist `ProcessStartInfo.waitforexit ()` block und wie kann ich es mit asynchronen Lesevorgängen beheben?

Warum ist `ProcessStartInfo.waitforexit ()` block und wie kann ich es mit asynchronen Lesevorgängen beheben?

Barbara Streisand
Barbara StreisandOriginal
2025-01-29 20:26:11202Durchsuche

Why Does `ProcessStartInfo.WaitForExit()` Block, and How Can I Fix It Using Asynchronous Reads?

Lösen Sie das Problem von ProcessTArtInfo.waitforexit () Blockierungsproblem: Asynchrones Lesenmethode

In einigen Fällen wird das Programm bei Verwendung von

bei

auf unbestimmte Zeit abhängen. Dieses Problem tritt auf, wenn der Standardausgangspuffer seine Grenze erreicht. Das Problem der Umleitung zur Standardausgabe und der Standardfehler erhöht dieses Problem, was zu einem Deadlock führt. ProcessStartInfo WaitForExit() Die Lösung besteht darin, asynchrones Lesen zu verwenden, um zu verhindern, dass der Puffer überflutet ist. In Kombination mit dem Programm für Objekt- und Ereignisverarbeitungsprogramme können die Ausgabe- und Fehlerdaten innerhalb der angegebenen Zeitüberschreitungszeit effektiv verarbeitet werden. Das Folgende ist ein Beispiel für Code:

AutoResetEvent Mit dieser Methode können Sie tote Sperren effektiv vermeiden, alle Ausgänge von Standardausgaben und Standardfehlern sammeln und Benachrichtigungen erhalten, wenn Daten verfügbar sind. Der Druck von Ausgangs- und Fehlerinformationen wird hinzugefügt, um die Programme zur Programmausführung klarer zu verstehen. Bitte stellen Sie sicher, dass die Variablen

,
<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。
            Console.WriteLine("Output:\n" + output.ToString());
            Console.WriteLine("\nError:\n" + error.ToString());
        }
        else
        {
            // 超时。
            Console.WriteLine("Timed out.");
        }
    }
}</code>
und

korrekt eingestellt wurden. filename

Das obige ist der detaillierte Inhalt vonWarum ist `ProcessStartInfo.waitforexit ()` block und wie kann ich es mit asynchronen Lesevorgängen 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