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 :

Multithreading : problème avec Abort()


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut Multithreading : problème avec Abort()
    Bonjour,

    J'ai un gros bug dont je n'arrive pas à déterminer la source.
    C'est très simple, il s'agit d'une application serveur (en mode console).
    J'ai deux Thread, un pour l'écoute sur un socket et l'autre pour vérifier la connection entre le client et le serveur.

    Le seul moyen d'arrêter le thread d'écoute et d'appelé la méthodes Abort().
    Pour la connection, il suffit de faire un while(unBool){//vérif connection}

    Dans le thread principal, lors de l'arrêt du serveur, je met unBool à false et fait Abort sur le thread d'écoute.
    les deux thread s'arrête. Jusqu'à là, pas de problème mais après avoir fait cela, je demande la fermeture du socket utilisé.

    Gros problème! Après avoir fait un Abort sur le thread d'écoute, la fonction s'arrête!

    Un petit topo pour mieux comprendre le bug:

    1 public void StopServer()
    2 {
    3 UnBool = false;
    4 ThreadEcoute.Abort();
    5 monSocket.Close();
    6 }

    là en gros les lignes 1,2,3,4 s'éxecute, le thread d'écoute gère l'exception ThreadAbortException et la fonction StopServer() s'arrête là. monSocket.Close() n'est pas exécuter ainsi que tout code se situant derrière ThreadEcoute.Abort();

    Quelqu'un saurait-il pourquoi?

  2. #2
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    ThreadEcoute pointe il bien vers le Thread que tu desire fermer ?

    Sinon, je sais que cela ne répond pas à ta question, mais si tu inverse les deux instructions ( 4 et 5 ) , ca marche?

    Dernière suggestion : met un gros try catch autour de l'ensemble des lignes, pour voir si une exception ne serait pas lancée.
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    L'inversion étape 4 et 5 marche mais c'est en effet frustrant de ne pas pourvoir résoudre le problème proprement.

    Je suis certaint que ThreadEcoute pointe sur le bon thread.

    Le gros try catch n'attrape aucune exception.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    abort sur un thread lance une exception sur le thread spécifié, donc un try catch est obligé d'attraper l'erreur, et dans le catch tu as le temps de faire tout le code que tu veux

    sinon je vois pas trop l'intéret d'une boucle infinie pour vérifier que la connexion est bonne, une connexion TCP avertit quand elle est coupée à priori, dans le pire des cas un timer est deja mieux

    sinon y a aussi le try finally, peu impote comment tu sors du try (meme une erreur), le finally sera executé
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    abort sur un thread lance une exception sur le thread spécifié
    Justement, c'est dans le thread spécifié, non l'appelant. Donc le try catch peu ne pas recevoir d'erreur. Mais après la fonction T1.Abort(), l'exécution continue normalement, non ? enfin, devrait..
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    Je sais tout cela,
    Je gère l'exception sur le ThreadEcoute. Mais je ne peux pas faire le reste de mon code dans le catch d'un autre thread que celui ou est exécuté ma fonction StopServer (a cause de variable locales,...)

  7. #7
    Membre expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Points : 3 134
    Points
    3 134
    Par défaut
    En effet, et cela serait incorrect d'un point de vue conceptuel...

    Etrange tout de meme que ton code stoppe brutalement, sans levée d'exception... La msdn ne précisant rien, je suppose que T1.Abort() est censé revenir à l'appel...

    Essaie de débugguer avec F11, peut être que tu trouveras une piste... Mais je n'y crois guère.
    Hervé Delannoy, Ingénieur études&développement.

    Je n'accepte pas les demandes de mise en relation MSN/yahoo sans motif.
    ------------------------------------------------------------------------
    Si , ni , ne peuvent vous aider, mais nous oui, pensez à un pti et au !
    Merci de vous relire
    ____________________________________________________________________________________
    Recherche joueurs de "Magic" sur Lille et environs.
    Donner plutôt que jeter.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je confirme thread.abort ne change en rien le thread qui appele ca (sauf si c'est lui meme )
    en général il est meme suivi d'un thread.join pour attendre que le thread soit réellement arrété (vu qu'on peut mettre du code dans le catch ...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Encore un problème avec le multithread
    Par Mario Rousson dans le forum VB.NET
    Réponses: 4
    Dernier message: 17/11/2014, 23h12
  2. C# Problème avec le Multithreading
    Par CleeM dans le forum C#
    Réponses: 1
    Dernier message: 23/01/2013, 15h02
  3. Problème avec du multithread
    Par benymypony dans le forum Débuter
    Réponses: 5
    Dernier message: 22/10/2011, 09h08
  4. Réponses: 8
    Dernier message: 04/03/2009, 14h39
  5. Problème avec select delay then abort
    Par semaj_james dans le forum Ada
    Réponses: 2
    Dernier message: 16/04/2007, 15h51

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