Maison > développement back-end > C++ > Pourquoi Waitforexit est-il décalé lors de la redirection de la sortie standard avec de grands flux de données?

Pourquoi Waitforexit est-il décalé lors de la redirection de la sortie standard avec de grands flux de données?

Susan Sarandon
Libérer: 2025-01-29 20:42:09
original
915 Les gens l'ont consulté

Why Does WaitForExit Stall When Redirecting Standard Output with Large Data Streams?

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>
Copier après la connexion
lorsque cela s'est produit au temps, vérifiez la propriété

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!

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