Maison > développement back-end > C++ > Pourquoi le bloc «ProcessStartinfo.WaitForexit ()», et comment puis-je le réparer en utilisant des lectures asynchrones?

Pourquoi le bloc «ProcessStartinfo.WaitForexit ()», et comment puis-je le réparer en utilisant des lectures asynchrones?

Barbara Streisand
Libérer: 2025-01-29 20:26:11
original
198 Les gens l'ont consulté

Why Does `ProcessStartInfo.WaitForExit()` Block, and How Can I Fix It Using Asynchronous Reads?

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>
Copier après la connexion
et

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal