Heim >Backend-Entwicklung >C++ >Warum stellt ProcessStartInfo.waitforexit () beim Umleiten von StandardOutput oder StandardError fest?
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!