Problème arrêt thread c#

Signaler
Messages postés
11
Date d'inscription
jeudi 27 septembre 2007
Statut
Membre
Dernière intervention
27 février 2010
-
Messages postés
11
Date d'inscription
jeudi 27 septembre 2007
Statut
Membre
Dernière intervention
27 février 2010
-
Bonjour, je suis débutant en visual studio 2005.
J'ai voulu créer un chat serveur/client et tout marche quasiment.
Et j'arrive enfin au moment où je dois tester si un client est toujours connecté, j'ai du lire des tonnes et des tonnes de pages sur internet.
Je réalise donc ceci ( oui il est simple lol je ne suis qu'un petit nouveau ) :
        private void lect_mess()
        {
                Byte[] buffer = new Byte[1024];
                String data = null;

                Socket MySocket = (Socket)liste[liste.Count - 1];

                    while (Thread.CurrentThread.IsAlive)
                    {
                         if (MySocket.Connected)
                         {
                             if (MySocket.Poll(10, SelectMode.SelectRead) && MySocket.Available == 0)
                             {
                                 Thread.CurrentThread.Abort();
                             }
                             else
                             {
                                 MySocket.Receive(buffer);
                                 data = null;
                                 data = Encoding.ASCII.GetString(buffer);
                                 listBox1.Items.Add("Client" + i + " : " + data);
                             }
                         }
                    }
        }
Lorsque je déconnecte un client du serveur , mon serveur reçoit un dernier message et j'obtiens aussi un message d'erreur du style "débogage, envoyer le rapport d'erreurs ou ne pas envoyer" puis l'application se ferme.
Je lis ce rapport d'erreur qui est :
EventType : clr20r3     P1 : serveur.exe     P2 : 1.0.2837.42190    
P3 : 470b2d1c     P4 : mscorlib     P5 : 2.0.0.0     P6 : 461eee3d     P7 : 154b
P8 : 21     P9 : system.argumentoutofrange 
et je n'y comprends rien, pouvez vous m'aider s'il vous plait? Je pense que l'erreur vient du Thread.CurrentThread.Abort(); mais je n'arrive vraiment pas à résoudre ce problème, je n'en peux plus ! Merci d'avance pour les réponses.

5 réponses

Messages postés
11
Date d'inscription
jeudi 27 septembre 2007
Statut
Membre
Dernière intervention
27 février 2010

Personne ne peut m'aider ? s'il vous plaît ..
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
Mets ton code dans un bloc try/catch ou utilise le debugger pour regarder quelle exception est levée : cela te fournira la cause précise du problème (et donc sa solution ;)

<hr size="2" width="100%" />
Working as designed
www.nikoui.fr
Messages postés
11
Date d'inscription
jeudi 27 septembre 2007
Statut
Membre
Dernière intervention
27 février 2010

Si j'ai bien compris ce que tu as dit, j'ai mis un bloc try\catch comme suit :

        private void lect_mess()
        {
                Byte[] buffer = new Byte[1024];
                String data = null;
                Socket MySocket = (Socket)liste[liste.Count - 1];

                    while (Thread.CurrentThread.IsAlive)
                    {
                       try
                         {
                             if (MySocket.Poll(10, SelectMode.SelectRead) && MySocket.Available == 0)
                             {
                                 Thread.CurrentThread.Abort();
                                 Thread.Sleep(0);
                             }
                             else
                             {
                                ...
                             }
                         }
                       catch ( Exception e )
                        {
                            Console.WriteLine("{0} Exception caught.", e);
                        }            
                    }
        }
Quand je le compile je n'ai aucune erreur, mais maintenant que dois-je faire ? désolé je ne comprends pas encore tres bien ce langage malgré ce que j'ai pu lire.
Messages postés
134
Date d'inscription
dimanche 1 octobre 2006
Statut
Membre
Dernière intervention
19 mai 2008
1
Bonsoir,

L'appel de la méthode Abort() sur le thread courant (CurrentThread) va tenter d'arrêter le thread courant, le Thread.Sleep(0); ne sert pas à grand chose derrière. Mais là, il est normal que ton application s'arrête car tu demandes l'arrêt du Thread Principal. Logiquement, au moment ou ta condition  if (MySocket.Poll(10, SelectMode.SelectRead) && MySocket.Available == 0) est validée, tu dois avoir une ligne dans la console correspondant à cette instruction  Console.WriteLine("{0} Exception caught.", e); et ton appli doit se fermer.

Cordialement,
Messages postés
11
Date d'inscription
jeudi 27 septembre 2007
Statut
Membre
Dernière intervention
27 février 2010

Merci pour la réponse,
.. il y a une question que je me pose, quelle est la différence entre exécuter l'exécutable dans le dossier bin\debug et l'exécuter a l'aide du debug dans le visual studio 2005? car quand j'exécute l'exécutable il fonctionne, mais bug au bout de plusieurs connexions/déconnexions du client tandis que quand j'utilise le debug, je n'arrive carrément pas a les connecter donc je ne peux pas voir la ligne dans la console comme tu me le dis.