Méthodes appelées par des threads

Résolu
Signaler
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
-
Bonjour,

J'ai adapté la source Client-Serveur de LumesH (Merci à Yxion pour son aide) puis j'y ai ajouté un bouton "start/stop" côté serveur. Problème : Quand je redémarre le serveur après un arrêt, les méthodes appelées par le thread "StartServeur" et tous ses "threads enfants" sont exécutées une fois de plus, comme si chaque fois que je redémarre un thread venait s'ajouter et tournerait en parrallèle des autres. Pourtant je supprime le thread "StartServeur" à chaque arrêt du serveur.

Voici comment est créé le thread "StartServeur" :

public void Start()
{
InstanceServeurThread = new Thread(new ThreadStart(StartServeur));
InstanceServeurThread.Name = "InstanceServeurThread_" + _UniqueID;
InstanceServeurThread.Priority = ThreadPriority.Normal;
InstanceServeurThread.Start();
}

J'ai essayé plusieurs façon d'arrêter le thread dans la méthode "Stop", d'ailleurs il doit bien être supprimé puisqu'aucun client ne peut se connecter quand il est arrêté. Le seul moyen d'éviter ce problème c'est de redémarrer carrément l'appli.

Est-ce que quelqu'un a déjà rencontré ce problème dans l'utilisation des threads?

7 réponses

Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008

Bon ben j'ai mis le temps mais j'ai fini par comprendre mon erreur en préparant l'exemple que je voulais mettre à disposition. En retirant chaque élément inutile pour l'exemple en question je me suis retrouvé avec quasiment rien et là, bingo, vu ma connerie!! ...qui m'a faite perdre des heures de concentration et quelques précieux neurones. Explications :

Le traitement du "start/stop" inclu en autres choses la prise en charge de l'évènement déclenché par le Thread et appelant ma méthode :

"InstanceClasseServeur.ConnectionStateEvent += new ConnectionStateHandler(ConnectionState);"

Donc à chaque fois que je redémarre en cliquant sur ce bouton une nouvelle prise en charge (supplémentaire) de l'évènement est créée, c'est pourquoi à chaque fois que l'évènement se produit l'appel de la méthode est effectué autant de fois que j'ai créé la prise en charge de l'évènement, c'est à dire autant de fois que j'ai cliqué sur le bouton "start/stop".

Les joies du débutant autodidacte, j'espère que ça pourra servir à d'autres.
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
t'as essayé InstanceServeurThread.Abort() ?

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008

oui, mais ça change rien, j'ai l'impression qu'il reste toujours une instance en mémoire. Il faudrait effectuer une "purge complète" équivalent au redémarrage de l'appli, mais j'sais pas comment faire.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
Salut,

Tu fais quoi dans la méthode StartServeur ? (en particulier au niveau de la gestion d'exceptions)

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
19
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 avril 2008

J'ai viré tout ce que je faisais dans la méthode sauf la création d'une instance socket avec une simple exception. Les appels aux méthodes de la form utilisant la classe qui démarre mes theads sont effectués par des invokes.
Je mettrais à dispo la semaine prochaine un exemple rapide reproduisant ce problème afin que vous ayez quelquechose de concret à tester.
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
c'est balo !

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
C'est pour ça qu'il faut prendre l'habitude se désabonner de l'event dès lors que l'on en a plus besoin :-)

/*
coq
MVP Visual C#
CoqBlog
*/