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