2010-08-31 5 views
7

Thread.Join nous renvoie si le thread est terminé. La même chose que nous pouvons déterminer en utilisant ThreadState. Alors, quelle est la différence entre Thread.Join() et Thread.ThreadState? Peut-on les utiliser de façon interchangeable?Thread.Join vs Thread.State

+2

while (t.ThreadState! = ThreadState.Stopped) HaltAndCatchFire(); –

Répondre

14

La différence entre d'inscription et en regardant ThreadState manuellement que Join est une opération de blocage. La fonction ne retournera pas tant que le délai d'attente n'est pas atteint ou que la cible Thread ne se termine pas. Vérification de ThreadState est plus d'une opération furtivement.

+0

Corrigez-moi si je me trompe, mais ThreadState n'est pas non plus fiable? – Josh

+2

Ahh ... à partir de * MSDN: Il existe deux énumérations d'état de thread, System.Threading.ThreadState et System.Diagnostics.ThreadState. Les énumérations d'état de thread ne présentent qu'un intérêt dans quelques scénarios de débogage. Votre code ne doit jamais utiliser l'état du thread pour synchroniser les activités des threads. * http://msdn.microsoft.com/en-us/library/system.threading.threadstate.aspx – Josh

+2

@Josh les deux ne sont pas fiables dans le sens où ils seulement fournir des informations sur le passé :) – JaredPar

6

Thread.join WAITS pour le fil à compléter. ThreadState vous donne juste un instantané du fil et revient sans attendre. Il y a aussi une variante de Thread.join qui prend du temps à attendre. ThreadState et Join sont extrêmement différents et je ne pense pas que les deux puissent être utilisés de manière interchangeable. Essayez de faire un test où vous faites les deux appels sur un thread qui a une boucle infinie.

3

Lorsque vous appelez Thread.Join(), il bloque le thread appelant jusqu'à ce que le thread qui a la méthode Join est terminé. Si elle est annulée ou complétée avec succès, Join() qui suit ne bloquera pas le thread appelant. Cela vous permet d'avoir 10 threads de travail et un thread principal dont l'opération doit être exécutée une fois tous les 10 threads terminés. Vous pouvez donc appeler Join() sur le premier thread. Cet appel bloquera le thread principal jusqu'à la fin du premier thread de travail. Après cela, vous pouvez appeler Join() sur le deuxième thread, et ainsi de suite jusqu'à ce que vous arriviez à thread # 10. Lorsque vous appelez Join() dessus, et que le thread principal reprend, vous pouvez être sûr que les 10 threads terminés et le thread principal peuvent reprendre leur opération.

Par exemple:

Thread workers[] = new Thread[10]; 

//*** create and start threads *** 

foreach(Thread worker in workers) 
{ 
    worker.Join(); 
} 

//All threads are completed, now this operation can continue... 

D'autre part, Thread.ThreadState ne retourne que le thread status (Aborted, Courir, ...) sans affecter l'état de thread appelant (pas d'inscription qui met le thread appelant à WaitSleepJoin Etat). Donc, ceci est à utiliser uniquement si vous voulez vérifier ce qui se passe avec thread afin que vous puissiez prendre une certaine action, ou vous voulez implémenter votre propre mécanisme de jointure, et ainsi de suite ...

0

Thread.Join va bloquer l'appel thread

Questions connexes