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 :

Comment arreter un thread suite à un evenement?


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 43
    Points : 35
    Points
    35
    Par défaut Comment arreter un thread suite à un evenement?
    J'ai un programme qui fait un telechargement dans un thread. Et je veux permettre l'annulation du download à partir d'un clique.
    Voila donc ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     threadDown.Abort();                    
     webResponse.Close();
     strResponse.Close();
     strLocal.Close();
     // Barre de prog à zero
     downlProg.Value = 0;
     lblWhat.Text = "Mise à jour annullée";
     lblNeed.Text = string.Empty;
    Mais voila l'exception qui se declenche:
    ObjectDisposedException was unhandled. Impossible d'accéder à un objet supprimé.
    au niveau de la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize });
    Cette ligne permet d'afficher la barre de progression.
    Apparemment, le thread veut continuer à s'executer meme apres Abort()!
    Quelqu'un peut il m'aider?

  2. #2
    Membre régulier
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Points : 88
    Points
    88
    Par défaut
    La méthode Abort() lance l'exception. Tu ne peux rien y faire, ce n'est pas une "erreur", c'est inévitable. Tu pourrais mettre une structure try catch. Toutefois, ce n'est pas élégant d'utiliser Abort(). Voici ce qu'il convient de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void myThreadStartsHere{
     
        while(continueToDownload){
            //LIRE n octets.
            //Si jamais la connexion est lente, faire dormir le thread quelques ms.
            Thread.Sleep( 50 );    
        }
     
    }
    De cette façon, tu as un booléen qui te permet d'interrompre le téléchargement en lui affectant 'false' lorsque l'utilisateur clique sur arrêter.

  3. #3
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Tu pourrais mettre une structure try catch. Toutefois, ce n'est pas élégant d'utiliser Abort().
    Par curiosité pourquoi ce n'est pas élégant l'utilisation d'Abort() ? A cause des try catch ?
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  4. #4
    Membre régulier Avatar de TrEiZe85
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Points : 88
    Points
    88
    Par défaut
    Il suffit de mettre ton thread en IsBackGround=true juste avant de faire ton abort. Enfin si j'ais bien compris ton prob

  5. #5
    Membre régulier
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par ced600
    Par curiosité pourquoi ce n'est pas élégant l'utilisation d'Abort() ? A cause des try catch ?
    Car tu te retrouves avec un catch{} vide. Mais si tu peux mettre ton thread en arrière plan, alors vas-y à fond. Toutefois, ce que j'aime en ajoutant un booléen, c'est que tu peux facilement faire du traitement supplémentaire (ex: clairer des ressources, supprimer des fichiers temporaires, etc).

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Car tu te retrouves avec un catch{} vide
    Il est vide uniquement si tu le laisses vide.
    Avec le catch tu peut récupérer l'exception et provoquer par exemple l'écriture dans un fichier de log que le thread a été arrêté normalement. Le catch n'est alors pas vide et c'est propre
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment mettre une classe principal en pause, sans arreter les threads
    Par KOULARK dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 28/11/2009, 22h19
  2. comment arreter un thread ?
    Par coax81 dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 28/05/2007, 23h05
  3. comment arreter un thread
    Par Mo_Poly dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/03/2007, 02h03
  4. [Thread] comment arreter un thread qui execute une methode b
    Par Cyber@l dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 04/08/2004, 10h51

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