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

Windows Forms Discussion :

[C#] Aide sur méthode bloquante


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut [C#] Aide sur méthode bloquante
    Bonsoir ou plutôt bonjour ^^

    voilà j'ai fait une petite fonction qui envoie un string qqc à un serveur et qui renvoie la derniere ligne de la réponse de celui-ci.
    La fonction récupere bien la dernière ligne mais bloque au niveau du "return"

    Voici la fonction :
    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
     
    private string SendToServer2(string str, string errString)
            {
     
                NetworkStream nS = tcpCli.GetStream();
                string sResponse = String.Empty;
                byte[] responseB = null;
     
                //Envoie au serveur
                byte[] sendB = new ASCIIEncoding().GetBytes(str);
                nS.Write(sendB, 0, sendB.Length);
                Console.WriteLine(new ASCIIEncoding().GetString(sendB));
     
                //Reception de la reponse serveur
                Console.WriteLine("entrée dans la boucle");
                while (!sResponse.StartsWith("a001"))
                {
                    responseB = new byte[tcpCli.ReceiveBufferSize];
                    nS.Read(responseB, 0, (int)tcpCli.ReceiveBufferSize);
                    sResponse = new ASCIIEncoding().GetString(responseB);
                }
                Console.WriteLine(sResponse);
                return sResponse;
     
            }
    Si vous voyez ce qui fait que ca bloque je veut bien que vous me le signaliez

    Je travaille sous vs 2005 express et le framework 2.0

    Merci par avance

    Julien

  2. #2
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut
    qu'est ce que tu appel bloquer ?

  3. #3
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    bah quand je fais le debug en mode pas à pas, je vois que la fonction recupere bien la derniere ligne de la reponse serveur vu que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(sResponse);
    ecrit bien sur la sortie console la réponse serveur. sur le prochain pas (donc le return) ca bloque. c'est comme si le programme freezé. Il ne sort pas de la fonction, il reste sur le return indéfiniment et donc la suite du programme ne s'execute pas...


    Julien

  4. #4
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    On peut avoir le code qui fait appel à la fonction, là où ça freeze ?

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    ouais bien sur

    le voici :

    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
     
    private void debut()
            {
                Console.WriteLine("Connection...");
                if (Connect())
                {
                    Console.WriteLine("login au serveur");
                    if (SendToServer2("a001 LOGIN " + login + " " + pass + CRLF, "? NO") != "")
                    {
                        Console.WriteLine("selection de la boite...");
                        if (SendToServer2("a001 Select Inbox" + CRLF, "? NO") != "")
     
                        {
                            Console.WriteLine("Search...");
                            string rep = SendToServer2("a001 search all" + CRLF, "? NO");
                            //traitement
     
                            //deco
                            disconnect();
                        }
                    }
                }
            }
    Donc en fait ca freeze au premier appel de la fonction donc tout le reste ne s'execute pas...

    meme un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Console.WriteLine(sendToServer2("...."));
    ne fonctionne pas vu que la fonction sendToServer() bloque sur le return

    Julien

  6. #6
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Je vois rien de choquant à première vue... Si tu fais ça ça fait quoi :
    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
    private string SendToServer2(string str, string errString, NetworkStream nS)
            {
                string sResponse = String.Empty;
                byte[] responseB = null;
     
                //Envoie au serveur
                byte[] sendB = new ASCIIEncoding().GetBytes(str);
                nS.Write(sendB, 0, sendB.Length);
                Console.WriteLine(new ASCIIEncoding().GetString(sendB));
     
                //Reception de la reponse serveur
                Console.WriteLine("entrée dans la boucle");
                while (!sResponse.StartsWith("a001"))
                {
                    responseB = new byte[tcpCli.ReceiveBufferSize];
                    nS.Read(responseB, 0, (int)tcpCli.ReceiveBufferSize);
                    sResponse = new ASCIIEncoding().GetString(responseB);
                }
                Console.WriteLine(sResponse);
                return sResponse;
     
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string rep = SendToServer2("a001 search all" + CRLF, "? NO", tcpCli.GetStream());
    :

    PS : La fonction plante tout le temps ou juste quand tu fais :
    string rep = SendToServer2("a001 search all" + CRLF, "? NO");
    :

  7. #7
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    merci de ta réponse alors pour répondre à ta dernière question, oui la fonction plante tout le temps et pas seulement lors de "a001 search all"...

    sinon j'ai essayé aussi ton code et c'est exactement la meme chose... la fonction bloque au niveau du return

    Et le truc c'est que je suis comme toi, c'est à dire que je ne vois rien de choquant dans le code (je fait du c# que depuis 1 semaine mais bon je vois qu'il y a rien de bizarre dans le code)

    Julien

  8. #8
    Membre à l'essai
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 23
    Points
    23
    Par défaut
    Problème résolu et j'avoue que j'ai honte

    En fait ce qui faisait "freeze" le programme c'était l'affichage de la réponse serveur sur la console... Le buffer étant défini avec une taille de 4096 le reste de la chaine de caractére était rempli avec des \0 (soit plus de 4000 caracteres inutiles)

    J'ai donc réduit la taille de mon buffer supprimé l'affichage console (qui n'était là que pour des raisons de debug) et ca marche sans problème

    Merci à ceux qui m'ont répondu

    Bonne fêtes à tous

    Julien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche aide sur la méthode gettype()
    Par Upsilone dans le forum VB.NET
    Réponses: 3
    Dernier message: 26/07/2009, 15h14
  2. aide sur méthode de programmation
    Par shirya dans le forum C#
    Réponses: 1
    Dernier message: 25/02/2007, 18h48
  3. Aide sur un projet en méthodes programmation systèmes
    Par citadine dans le forum Réseau
    Réponses: 6
    Dernier message: 17/01/2007, 11h40
  4. aide sur la méthode openschema
    Par boss_gama dans le forum ASP
    Réponses: 9
    Dernier message: 29/06/2006, 12h57

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