Heim >Backend-Entwicklung >C++ >Warum stellt ProcessStartInfo.waitforexit () beim Umleiten von StandardOutput oder StandardError fest?

Warum stellt ProcessStartInfo.waitforexit () beim Umleiten von StandardOutput oder StandardError fest?

DDD
DDDOriginal
2025-01-29 20:41:09803Durchsuche

Why Does ProcessStartInfo.WaitForExit() Stall When Redirecting StandardOutput or StandardError?

Lösen Sie das Problem, dass der ProzessstartInfo.waitforexit () steckt, wenn der Regattcing -Ausgang oder der Standardfehler des Standards

Wenn der Prozessstartinfo in StandardOutput oder StandardError weiterleitet, kann es Probleme geben. Der interne Puffer kann überlaufen, was zu einem potenziellen Deadel führt oder Ihren Prozess blockiert.

Um solche Deadlocks zu verhindern und die Ausgabe aus zwei Streams zu sammeln, sollten Sie die folgenden asynchronen Lesemethoden verwenden:

Diese asynchrone Methode stellt sicher, dass der Puffer nicht überflutet und das System einfrieren. Jetzt können Sie die Ausgabe lesen und sammeln, ohne sich um verzögerte oder potenzielle tote Schlösser zu sorgen. Der Code wurde verbessert und enthält die Verarbeitung der Fehlerausgabe.
<code class="language-csharp">using System.Diagnostics;
using System.Text;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        string filename = "TheProgram.exe";
        string arguments = "some arguments";
        int timeout = 10000; // 10 秒超时

        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}");
                    Console.WriteLine($"错误: {error}"); //添加错误输出
                }
                else
                {
                    // 超时或发生错误。
                    Console.WriteLine("进程超时或失败。");
                }
            }
        }
    }
}</code>

Das obige ist der detaillierte Inhalt vonWarum stellt ProcessStartInfo.waitforexit () beim Umleiten von StandardOutput oder StandardError fest?. 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