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 :

Stopper un thread


Sujet :

C#

  1. #1
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut Stopper un thread
    Bonjour tout le monde,

    je viens vous voir aujourd'hui pour un petit problème tout bête mais dont je trouve pas comment m'en sortir.

    Prenons un exemple très simple. Je propose à l'utilisateur une liste de départements. Dès qu'il choisit un département, je lance un thread qui va rechercher toutes les villes de ce département.

    Le problème, c'est que si pendant un thread tourne l'utilisateur choisit un autre traitement, un deuxième thread est lancé mais le premier tourne toujours.

    J'aimerai donc au moment du lancement du second thread pourvoir stopper le premier. Auriez-vous une idée de comment faire ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Il y a plusieurs façons de faire, selon ce que tu utilises

    Quelle version du Framework utilises-tu ?

    Est-ce que tu utilises des Tasks ? Ou des BackgroundWorkers ? Ou des Threads classiques ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut
    Alors j'utilise le Framework 4.0 avec des Threads classiques (je ne peux pas changer la version du framework mais je peux bosser sur autre chose que les threads si nécessaire :p )

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ok merci pour ces précisions ! Personnellement j'ai plus d'expérience avec les tasks, et j'utilise le "Cancellation Framework", qui est assez simple à utiliser et à comprendre (il suffit de lire un peu la MSDN).

    Sinon, tu peux utiliser une variable volatile de type bool afin de gérer l'exécution des threads. Voici une discussion assez complète sur le sujet : http://stackoverflow.com/questions/3...another-thread
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    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
    3 méthodes
    la bien mais pas toujours utilisable c'est d'avoir un booléen comme dit précédemment, mais c'est pratique quand on a une boucle (pour pouvoir vérifier le booléen souvent et sortir du void)
    la moins bien c'est .abort sur le thread, ca déclenche une exception qui se propage à travers tous les catchs apparemment, donc ca arrete le thread, par contre le premier throw peut se trouver dans le framework, voir s'il n'y a pas d'effets de bords ...
    la 3ème je ne sais pas trop quoi en penser c'est .interrupt sur le thread, là ca arrête le thread où il en était directement ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    d'après un bouquin que j'avais lu, le abort est à éviter à tout prix, sauf en ultime recourt. Je ne me rappelle plus dans le détail mais ça n'était pas qu'une question d'exception.

    Je crois que le interrupt est très proche du abort mais ne lève pas d'exception.

    A ma connaissance il n'y a pas d'autre choix que celui du booléen qu'on interroge régulièrement. J'ai personnellement une préférence pour le Cancel du BackgroundWorker.

    Edit : je viens de voir dans mon bouquin, le FrameWork 4 propose CancellationToken et CancellationTokenSource. Ca peut valoir le coup d'oeuil...

  7. #7
    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
    il y a une différence entre abort et interrupt au moins au niveau de ce qu'il se passe
    après le booléen comme je disais ne fonctionne pas dans tous les cas, si dans le thread tu appelles juste une procédure stockée de 3 minutes, il faudra passer par abort ou interrupt ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    justement CancellationToken semble permettre d'arretter le thread de façon managé même dans le cas que tu viens de donner.

    source : http://msdn.microsoft.com/fr-fr/library/dd997364.aspx voir la section "Écoute en inscrivant un rappel".

    C'est bête je n'ai plus le texte que j'avais lu concernant Abort, en gros ça disait que ça n'était pas très bon pour le CLR pour nettoyer certaines choses, l'auteur avait pondu toute une page à ce sujet...

  9. #9
    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
    Citation Envoyé par giova_fr Voir le message
    justement CancellationToken semble permettre d'arretter le thread de façon managé
    je viens de lire le lien, c'est exactement le même principe que le booléen, dans les exemples donnés ils vérifient un booléen sur une instance mais dans une boucle ...

    pour arrêter un thread qui fait une exécution longue sans boucle je pense donc qu'il n'y a pas d'autres choix que abort ou interrupt, ou alors de mieux coder pour appeler plusieurs petites parties
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut
    Bonjour tout le monde,

    merci à tous pour votre aide. Je viens de tester le Interrupt et le problème est que le thread va jusqu'au bout quand même. Est-ce normal ?

  11. #11
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    D'après la MSDN, c'est normal :
    Citation Envoyé par MSDN
    Si ce thread n'est pas actuellement bloqué à l'état d'attente, de veille ou de jointure, il sera interrompu dès qu'il commencera à bloquer.Une ThreadInterruptedException est levée dans le thread interrompu, mais seulement une fois que le thread est bloqué.Si le thread ne bloque jamais, l'exception n'est jamais levée et le thread peut donc se terminer sans jamais être interrompu.
    Source : http://msdn.microsoft.com/fr-fr/libr...interrupt.aspx


    Voici une lecture intéressante sur l'arrêt des Threads : http://stackoverflow.com/questions/3...632642#3632642
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Si "Abort" est déconseilé, c'est parce que cette exception ce comporte différement des autres. Il me semble qu'elle bypass les clauses finally, et du coup il se peut que les ressources non managé ne soit pas liberer. Ce point est à verifier.

    EDIT:
    D'apres la msdn Le comportement lié au finally, partialement executé, serait propre à version 1.x du Framework. Par contre, la msdn evoque le problème des constructeurs statiques, qui ne semble toujours pas résolu.

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    Tu devrais t'orienter plutôt vers un marqueur d'arrêt ...

    Qui démarre le deuxième thread ? comment ça se passe ? peux tu donner un peu plus d'élément ?
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

Discussions similaires

  1. [thread] Stopper un thread
    Par poukill dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 04/12/2008, 17h34
  2. Stopper un thread après un certain temps
    Par Rodrigue dans le forum C++/CLI
    Réponses: 1
    Dernier message: 14/04/2008, 13h25
  3. Arrêter / Stopper un Thread défini
    Par ouranos21 dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 30/01/2008, 14h25
  4. Stopper un thread par un signal
    Par kazh75 dans le forum Général Python
    Réponses: 4
    Dernier message: 04/04/2007, 14h53
  5. Stopper un thread
    Par Tenguryu dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2006, 21h57

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