Le problème de la grande sortie de la norme de flux de données lorsque la sortie de la grande norme de streaming de données est redirigée lorsque le problème suspendu par waitForexit
Lors de l'exécution du processus, il peut rencontrer des problèmes liés aux restrictions avec le tampon
. Plus précisément, lorsque la déduction, si la taille de sortie dépasse un certain seuil (comme 7 Mo), le programme peut être accroché à un moment indéfini pendant la période ProcessStartInfo
. StandardOutput
StandardOutput
la raison WaitForExit
Lorsque la dépendance et le tampon interne sont pleins, ce comportement se produira. Si le processus d'appel attend le processus cible avant de lire , le processus cible sera bloqué lorsque vous essayez d'écrire une zone de tampon complète pour l'empêcher de la fin. Au lieu de cela, si le processus d'appel utilise la sortie de la récupération , si le processus cible n'est pas désactivé (par exemple, s'il ne se termine pas ou si son flux
est bloqué), il peut être bloqué.
StandardOutput
Solution StandardOutput
ReadToEnd
StandardOutput
Afin de résoudre ce problème, utilisez la lecture asynchrone pour empêcher le tampon d'atteindre la capacité. L'exemple de code suivant montre comment effectuer cette opération: StandardError
Cette solution utilise un rappel asynchrone pour traiter les données reçues de et pour s'assurer que la zone de tampon interne ne sera pas pleine et empêche les serrures mortes.
Remarque:
Afin d'éviter<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>
du processus avant la sortie du processus d'accès ou du flux d'erreur. StandardOutput
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!