IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

StreamReader.ReadAsync ou comment boucler sur la sortie standard ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 13
    Par défaut StreamReader.ReadAsync ou comment boucler sur la sortie standard ?
    Bonjour,

    J'ai un soucie avec la lecture de la sortie standard d'un process.
    Voici comment je lance le process :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      myProcess.StartInfo.FileName = app;
                myProcess.StartInfo.Arguments = "--interactive";
                myProcess.StartInfo.UseShellExecute = false;
                myProcess.StartInfo.RedirectStandardInput = true;
                myProcess.StartInfo.RedirectStandardOutput = true;
     
                myProcess.Start();
                myStreamWriter = myProcess.StandardInput;
                myStreamReader = myProcess.StandardOutput;
    Ensuite , je souhaite envoyer des commandes et récupérer les réponses. Pour ça, j'utilise ReadAsync() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    using (myStreamReader)
                    {
                        await myStreamReader.ReadAsync(result, 0, 500);
                    }

    Ça fonctionne bien, mais qu'une fois. En sortant de ReadAsync, le stream est fermé, myStreamReader.BaseStream est null.


    Or je veux envoyer d'autre commandes et boucler sur ReadAsync pour récupérer les réponses.

    Quelle est la méthode ?


    En vous remerciant,

    Pendloup

  2. #2
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    Dans ton cas, il ne faut pas utiliser de using (myStreamReader), en sortant du using, myStreamReader est libéré. donc ton basestream est null, normal.

    C'est tout ce que je peux dire au vu de ce que tu nous postes.

    Bon dév.

  3. #3
    Membre averti
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 13
    Par défaut
    Bonjour,

    Merci pour cette réponse. J'ai testé sans le using. Effectivement, ça résout mon problème . Mais un autre pb se présente. Je boucle sur le ReadAsync pour me remettre en attente de la prochaine sortie de texte. Mais il retourne immédiatement et je récupère toujours la chaîne précédente.

    Faut-il vider les données du StreamReader ? Si oui , comment ? Ou bien faut-il lui indiqué la position x courante ? Mais comment la connaitre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadAsync(result, x, 500);
    Merci.

    Pendloup

    Voici la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     private async void StartRead()
            {
                char[] result = new char[5000];
                StringBuilder builder = new StringBuilder();
     
                do
                {
                    try
                    {
     
                        //using (myStreamReader)
                        {
                            await myStreamReader.ReadAsync(result, 0, 500);
                        }
                    }
                    catch (Exception e)
                    {
     
                    }
     
                    foreach (char c in result)
                    {
                        if (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c))
                        {
                            builder.Append(c);
                        }
                    }
                    TextOutput.Text = builder.ToString();
                    builder.Clear();
                }
                while (true);
            }

  4. #4
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Bonjour,

    Tu lis toujours le flux de 0 à 500, si des nouvelles données sont inscrites dans le flux, tu ne les verras pas

    Tu as dimensionné ton tableau à 5000 donc tu devrais faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ReadAsync(result, x * 500, 500);
    x++;
    PS : attention à la taille de ton tableau qui est à 5000

  5. #5
    Membre averti
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 13
    Par défaut
    Je comprends bien le rôle de l'index x. Mais ça ne résout pas mon problème.
    Après avoir bouclé suffisamment pour lire toutes les données, il continue de boucler indéfiniment.

    Je pense que la raison est que les données sont toujours dans le buffer du stream de sortie. Le fait de les lire ne les supprime pas . Donc ReadAsync retourne immédiatement tant qu'il y a des données.

    cordialement,

    Pendloup

  6. #6
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    Citation Envoyé par Pendloup Voir le message
    Après avoir bouclé suffisamment pour lire toutes les données, il continue de boucler indéfiniment.

    Je pense que la raison est que les données sont toujours dans le buffer du stream de sortie. Le fait de les lire ne les supprime pas . Donc ReadAsync retourne immédiatement tant qu'il y a des données.
    Moi à l'inverse je pense que c'est dû au do...while (true)...


Discussions similaires

  1. comment boucler sur la 1ere image clé
    Par scoubi74 dans le forum Flash
    Réponses: 5
    Dernier message: 14/04/2008, 09h59
  2. Réponses: 1
    Dernier message: 10/02/2008, 20h13
  3. Comment afficher sur la sortie standard ?
    Par cranama dans le forum C
    Réponses: 8
    Dernier message: 31/12/2007, 14h44
  4. Réponses: 2
    Dernier message: 24/12/2007, 09h53
  5. [VB6] Comment boucler sur des controls d'un form ?
    Par lankviller dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2003, 16h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo