7
votes

Thread.join vs thread.state

thread.join nous renvoie si le thread est terminé. La même chose que nous pouvons déterminer l'utilisation de la threadstate. Alors quelle est la différence entre thread.join () et thread.threadstate?

Pouvons-nous les utiliser de manière interchangeable?


1 commentaires

tandis que (T.threadstate! = Threadstate.stopé) Haltandcatchfire ();


4 Réponses :


6
votes

thread.join attend que le fil se termine. Threadstate vous donne simplement un instantané de la fil et retourne sans attendre. Il y a aussi une variante de thread.join qui prend un temps d'attendre. Threadstate et rejoindre 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 appelle les deux appels sur un fil qui a une boucle infinie.


0 commentaires

14
votes

La différence entre rejoindre et regarder threadstate est que joint est une opération de blocage. La fonction ne reviendra pas tant que le délai d'attente est atteint ou la cible thread est terminée. Vérification de la threadstate est plus d'une opération de jeux de jeux.


3 commentaires

Corrigez-moi si je me trompe, mais si le threadstate n'est-il pas aussi peu fiable?


Ahh ... de MSDN: Il existe deux énumérations d'état de fil, System.threading.threadstate et System.Diagnostics.threadstate. Les énumérations d'état du fil ne sont intéressés que dans quelques scénarios de débogage. Votre code ne doit jamais utiliser l'état de thread pour synchroniser les activités des threads. msdn.microsoft.com/en-us/library/...


@Josh les deux ne sont pas fiables dans le sens où ils ne fournissent que des informations sur le passé :)



3
votes

Lorsque vous appelez thread.join () code> Il bloque le thread d'appel jusqu'à la fin du fil que la méthode de jointure est terminée. Si elle est annulée ou terminée avec succès, Joindre () que suit ne bloquera pas le fil d'appel. Cela vous permet d'avoir 10 threads ouvriers et un fil principal quelle opération doit être exécutée après les 10 threads terminés. Vous pouvez donc appeler joindre () sur le premier fil. Cet appel bloquera le fil principal jusqu'à ce que le premier fil de travail se termine. Après cela, vous pouvez appeler Joindre () sur deuxième thread, et ainsi de suite jusqu'à ce que vous fassiez le fil # 10. Lorsque vous appelez JOIN () dessus, et le fil principal est repris, vous pouvez être sûr que tous les 10 threads terminés et le thread principal peuvent reprendre son fonctionnement.

Par exemple: P>

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...


0 commentaires

0
votes

thread.join bloquera le fil d'appel


0 commentaires