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 :

[Thread] Difference entre Join() et Sleep() ?


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut [Thread] Difference entre Join() et Sleep() ?
    Bonjour,

    Quelle est la différence entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.CurrentThread.Join(500)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.Sleep(500);
    Merci.

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Pour le coup, il doit pas y'avoir grande différence.
    En fait, Join est utilisé pour synchroniser des threads. Généralement on fait un threadFils.Join() dans le thread père: dans ce cas là, le père attend son fils jusqu'au timeout. Chose qui n'est pas possible avec Sleep qui fait juste dormir le thread en question.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Ok.
    En fait je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Thread threadCompute = new Thread(new ThreadStart(ConeCompute));
    threadCompute.IsBackground = true;
    threadCompute.Start();
     
    private void ConeCompute()
    {
       // calculs..
     
       threadCompute.Sleep()  n'existe pas
      que faut-il utiliser à la place ?
     
    }

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Sleep() n'existe pas, il faut préciser une durée de dodo!
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myThread.Sleep(TimeSpan.FromMinutes(1));

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Au vu du code donné, je dirais surtout que tu as une erreur car ta variable n'a pas la portée pour être utilisée dans ta méthode. Essaye avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentThread.Sleep(TimeSpan.FromMinutes(1));
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  6. #6
    Membre chevronné Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Par défaut
    La méthode Sleep étant déclarée "static" je ferais lutôt ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.Threading.Thread.Sleep(TimeSpan.FromMinutes(1));
    Pascal

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Sleep() n'existe pas, il faut préciser une durée de dodo!
    Non je voulais dire que Thread n'a pas la méthode Sleep, Intellisense n'a pas Sleep dans sa liste si tu préfères !

    Vis-a-vis des deux autres codes proposés,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.Threading.Thread.Sleep(TimeSpan.FromMinutes(1));
    et
    CurrentThread.Sleep(TimeSpan.FromMinutes(1));
    comment le compilo va t-il savoir de quel thread on parle ?
    C'est ca qui m'intrigue, quand je met CurrentThread, c'est le thread principal, sinon quel thread prend-il ?

    Il me semble plus logique d'appeler threadCompute.Sleep ou .Join pour bien lui spécifier que c'est ce thread là que l'on veut endormir, non ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Ok merci, je comprend mieux. Dans mon cas le CurrentThread pointe vers mon thread threadCompute donc.

    Par contre
    n'existe pas, Intellisense ne l'a pas dans sa liste, c'est pour cela que j'ai utilisé Join(500).

    Du coup, Join() va arrêter pendant x millisecondes le thread parent qui dans mon cas est threadCompute c'est bien cela ?

  9. #9
    Membre chevronné Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Par défaut
    La méthode Sleep() étant statique de toute façon on ne peut y accéder via une instance de type Thread. Que ce soit via Threading.CurrentThread ou bien via la variable threadCompute.

    Pascal

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Au temps pour moi, Pascal_c a raison je me suis complètement planté de langage. Thread.Sleep() agit directement sur le thread concerné, pas besoin d'aller chercher le thread en question :/
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Par défaut
    Donc,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentThread.Join(500)
    est exactement similaire à
    C'est ca ?

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 220
    Par défaut
    Oui
    mais un Join() a pour but la synchronisation entre thread

    Si tu veux endormir ton thread par exemple pour re-tester une connection après 5 sec il faut utilisé Thread.Sleep(5000)

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par jeremm Voir le message
    Donc, CurrentThread.Join(500) est exactement similaire à Thread.Sleep(500) C'est ca ?
    non
    join sert à la synchronisation comme dit précédemment, un exemple pourrait être :

    une classe créé 2 threads, ils travaillent en même temps, mais à un moment l'un d'eux à besoin du résultat trouvé par l'autre pour continuer (donc qu'il soit terminé), on fait alors autrethread.join()

    sans préciser de temps ca veut dire qu'on attend qu'ils soit fini à l'infini
    avec un temps en paramètres ca veut dire qu'on attend qu'il soit fini, mais on veut un timeout pour que même s'il n'est pas fini on ne s’arrête pas indéfiniment sur l'instruction join
    le timeout est par définition un temps maximal, là où le sleep attendra toujours le temps fourni, le join(500) pourra attendre moins, genre si le thread qu'on veut join est déjà terminé, le join sortira tout de suite ; si le thread s'arrete 200ms après, le join attendra 200ms seulement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Comme Pol63 l'a expliqué, si les deux ont le même effet c'est uniquement parce que Join est appelé sur le thread courant : le thread s'attend donc lui-même, à concurrence de la durée spécifiée. Et comme il ne peut pas se terminer alors qu'il est en train de s'attendre, on finit par atteindre la durée spécifiée. Le résultat pratique dans ce cas précis est donc équivalent à Sleep même si les deux n'ont rien à voir.

    Cela dit, je ne parierais par sur le succès de CurrentThread.Join() sur toutes les plateformes. Mieux vaut utiliser Join() pour ce pour quoi il est fait et, dans le cas présent, utiliser Sleep(). Et puis cela épargnera au relecteur un "wtf ?!".

Discussions similaires

  1. Réponses: 9
    Dernier message: 30/10/2013, 12h48
  2. Difference entre INNER JOIN et une jointure Classqiue
    Par inter_amine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/09/2009, 12h13
  3. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  4. [] Difference entre MSHFlexGrid et MSFlexGrid
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/04/2003, 08h48
  5. Difference entre types d'Adresse IP
    Par freud dans le forum Développement
    Réponses: 3
    Dernier message: 02/03/2003, 02h06

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