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? P>
Pouvons-nous les utiliser de manière interchangeable? P>
4 Réponses :
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. P>
Essayez de faire un test où vous appelle les deux appels sur un fil qui a une boucle infinie. P>
La différence entre rejoindre et regarder threadstate code> est que joint code> est une opération de blocage. La fonction ne reviendra pas tant que le délai d'attente est atteint ou la cible thread code> est terminée. Vérification de la threadstate code> est plus d'une opération de jeux de jeux. p>
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. I> 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é :)
Lorsque vous appelez Par exemple: P> 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. 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...
thread.join bloquera le fil d'appel p>
tandis que (T.threadstate! = Threadstate.stopé) Haltandcatchfire ();