Bonjour,
Quelle est la différence entre :
etCode:System.Threading.Thread.CurrentThread.Join(500)
Merci.Code:System.Threading.Thread.Sleep(500);
Version imprimable
Bonjour,
Quelle est la différence entre :
etCode:System.Threading.Thread.CurrentThread.Join(500)
Merci.Code:System.Threading.Thread.Sleep(500);
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.
Ok.
En fait je fais :
Code:
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 ? }
Sleep() n'existe pas, il faut préciser une durée de dodo!
Par exemple
Code:myThread.Sleep(TimeSpan.FromMinutes(1));
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:CurrentThread.Sleep(TimeSpan.FromMinutes(1));
La méthode Sleep étant déclarée "static" je ferais lutôt ceci :
PascalCode:
1
2 System.Threading.Thread.Sleep(TimeSpan.FromMinutes(1));
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,
comment le compilo va t-il savoir de quel thread on parle ?Code:
1
2
3 System.Threading.Thread.Sleep(TimeSpan.FromMinutes(1)); et CurrentThread.Sleep(TimeSpan.FromMinutes(1));
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 ?
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).Code:CurrentThread.Sleep()
Du coup, Join() va arrêter pendant x millisecondes le thread parent qui dans mon cas est threadCompute c'est bien cela ?
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
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 :/
Donc,
est exactement similaire àCode:CurrentThread.Join(500)
C'est ca ?Code:Thread.Sleep(500);
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)
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
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 ?!".