Das Problem des großen Datenstromstandsausgangs der großen Datenstreams, wenn die Ausgabe des großen Datenstreaming -Standards umgeleitet wird, wenn das Problem von WaitForexit
hängt Bei der Durchführung des Prozesses kann dies auf Probleme im Zusammenhang mit Einschränkungen mit
Puffer stoßen. Wenn der Abzug, wenn die Ausgangsgröße einen bestimmten Schwellenwert (z. B. 7 MB) überschreitet, kann das Programm während der ProcessStartInfo
-Präze zu einer unbestimmten Zeit aufgehängt werden. StandardOutput
StandardOutput
Der Grund WaitForExit
Wenn der abhängige und der interne Puffer voll sind, erfolgt dieses Verhalten. Wenn der Anrufvorgang vor dem Lesen von auf den Zielvorgang wartet, wird der Zielvorgang blockiert, wenn versucht wird, einen vollständigen Pufferbereich zu schreiben, um ihn vom Ende zu verhindern. Wenn der Anrufprozess Abrufausgabe verwendet, kann er blockiert, wenn der Zielprozess nicht ausgeschaltet wird (zum Beispiel, wenn er nicht endet oder sein -Stream blockiert ist), kann er blockiert werden.
Lösung StandardOutput
StandardOutput
ReadToEnd
Um dieses Problem zu lösen, verwenden Sie asynchrone Lesen, um zu verhindern, dass der Puffer Kapazität erreicht. Das folgende Codebeispiel zeigt, wie diese Operation ausgeführt wird: StandardOutput
StandardError
und empfangen werden, um sicherzustellen, dass die interne Pufferzone nicht voll ist und tote Schlösser verhindern.
Hinweis:Um
zu vermeiden, wenn zum Zeitpunkt aufgetreten ist, überprüfen Sie die<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。 } else { // 超时。 } } }</code>
Das obige ist der detaillierte Inhalt vonWarum bleibt WaitForexit bei der Umleitung der Standardausgabe mit großen Datenströmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!