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 :

Arrêt de Thread avec appel bloquant..


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut Arrêt de Thread avec appel bloquant..
    Bonjour à toutes et à tous.

    Je vais essayer de faire simple pour décrire mon problème :

    J'ai un service dans laquelle j'appelle une méthode à travers un thread se trouvant dans une autre classe qui fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    serverThread = new Thread(HttpServer.StartListening);
     
    public static void StartListening()
    {    
         while(run)
         {
              ....
              TcpClient client = server.AcceptTcpClient();
              ....
         }
    }
    Le problème est que quoi qu'il arrive je me retrouve avec un appel bloquant puisque meme si ma variable run est a false l'appel à déjà était fait.

    Du coup je n'arrive pas à arrêter mon thread, et je ne peut pas arréter proporement mon service.

    Comment faire pour arreter ce thread quand i lest en appel bloquant ??

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Peut être du côté de BeginAcceptTcpClient ?

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Oui merci j'ai utilisé cela , me reste des problèmes à corriger car il reste toujours quel que chose qui s'arrête mal. je vous tiens au courant.

    Merci

  4. #4
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Points : 95
    Points
    95
    Par défaut
    Salut
    j'ai le meme souci, et je ne pense pas que BeginAccept puisse regler le probleme, car dans une boucle d'ecoute il y aura toujours un blocage au niveau de la socket.
    J'ai essayé de mettre en reference globale ma socket (qui est plutot un UdpClient dans mon cas) pour qu'elle soit accessible depuis le thread principale pour la fermer, mais ça ne marche pas correctement...

  5. #5
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Points : 95
    Points
    95
    Par défaut
    en fait ça marche bien, mais la fonction bloquante de reception tombe en erreur... donc c'est pas très propre, faut intercepter l'erreur pour pas que ça plante

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    J'ai réussi à faire en sorte de ne pas devoir intercepter l'erreur et mon service s'arrête enfin parfaitement après 2 3 modifs.

    Voici comment j'ai fait pour eviter de devoir l'intercepter :

    J'ai utilisé simplement un boolean qui des que j'invoque ma méthode OnStop du service il appel une méthode se trouvant dans ma classe listener qui passe mon boolean a false.

    il ne te reste plus donc qu'a faire un petit if avant d'écouter une connexion entrante :
    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
    public static void DoAcceptTcpClientCallback(IAsyncResult ar)
            {
                if (run)
                {
                    Tracer.Trace("Connexion détectée");
     
                    // Appel bloquant pour accepter les requêtes
                    using (TcpClient client = ((TcpListener)ar.AsyncState).EndAcceptTcpClient(ar))
    ......
                }
                else
                {
                    tcpClientConnected.Set();
                }
                    {
    Pour bien arrêter ton service fais comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                HttpServer.Arret(); // méthode qui passe le boolean a false;
     
     
                Dispose();
                Tracer.Trace("Canstop");
                CanStop = true;
    la méthode arrêt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            public static void Arret()
            {
                run = false;
                tcpClientConnected.Set();
                listener.Stop();
            }
    l'utilisation de l'espèce de mutex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           // Permet de faire un genre de mutex.
            private static readonly ManualResetEvent tcpClientConnected = new ManualResetEvent(false);
    la méthode StartListening :
    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
           public static void StartListening()
            {
     
                IPAddress localAddr = IPAddress.Any;
                // TcpListener server = new TcpListener(port);
                listener = new TcpListener(localAddr, Port);
                Tracer.Trace("Création du listener");
                // Start listening for client requests.
                listener.Start();
                try
                {
                    while (run)
                    {
                        tcpClientConnected.Reset();
                        listener.BeginAcceptTcpClient(DoAcceptTcpClientCallback, listener);
                        // Wait until a connection is made and processed before
                        tcpClientConnected.WaitOne();
     
                    }
                }
                catch (Exception e)
                {
                    Tracer.Error("Exception: {0}", e);
                }
            }
    Dis moi si tu as réussis !

Discussions similaires

  1. [GLib] Interrompre un appel bloquant dans un thread
    Par Zorgblub dans le forum Réseau
    Réponses: 3
    Dernier message: 17/11/2007, 18h02
  2. Réponses: 7
    Dernier message: 18/09/2006, 22h01
  3. Réponses: 5
    Dernier message: 16/12/2005, 17h41
  4. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15
  5. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01

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