Résoudre le problème de ProcessTartinfo.WaitForexit () Problème de blocage: Méthode de lecture asynchrone
Dans certains cas, lorsque vous utilisez
, le programme passera indéfiniment à. Ce problème se produit lorsque le tampon de sortie standard atteint sa limite. Le problème de la redirection vers la sortie standard et les erreurs standard augmente ce problème, ce qui mène à une impasse. ProcessStartInfo
WaitForExit()
La solution consiste à utiliser la lecture asynchrone pour empêcher le tampon de déborder. Combinée avec le programme de traitement des objets et des événements , les données de sortie et d'erreur peuvent être traitées efficacement dans le délai spécifié. Ce qui suit est un exemple de code:
AutoResetEvent
Grâce à cette méthode, vous pouvez éviter efficacement les verrous morts, collecter toutes les sorties des sorties standard et des erreurs standard et recevoir des notifications lorsque les données sont disponibles. L'impression des informations de sortie et d'erreur est ajoutée pour comprendre les résultats de l'exécution du programme plus clairement. Veuillez vous assurer que
<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。 Console.WriteLine("Output:\n" + output.ToString()); Console.WriteLine("\nError:\n" + error.ToString()); } else { // 超时。 Console.WriteLine("Timed out."); } } }</code>
les variables ont été correctement définies. filename
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!