Partager via


États des threads managés

La propriété Thread.ThreadState fournit un masque de bits qui indique l'état actuel du thread. Un thread se trouve toujours dans au moins un des états possibles dans l'énumération ThreadState, et peut être dans plusieurs états en même temps.

Remarque importanteImportant

L'état du thread n'est utile que dans quelques scénarios de débogage.Votre code ne doit jamais utiliser l'état du thread pour synchroniser les activités de threads.

Lorsque vous créez un thread managé, il se trouve à l'état ThreadState.Unstarted. Le thread reste à l'état Unstarted jusqu'à ce que vous appeliez la méthode Thread.Start, qui met le thread à l'état Running afin que le système d'exploitation puisse planifier son exécution.

Les threads non managés qui entrent l'environnement managé ont déjà démarré. Une fois qu'un thread est démarré, un nombre d'actions peut provoquer une modification de son état. Le tableau suivant répertorie les actions entraînant un changement d'état, ainsi que le nouvel état correspondant.

Action

Nouvel état résultant

Le constructeur pour la classe Thread est appelé.

Unstarted

Un autre thread appelle la méthode Thread.Start sur le nouveau thread, et l'appel est retourné.

RemarqueRemarque
La méthode Start ne retourne pas jusqu'à ce que le nouveau thread ait l'état Running.Il n'y a aucun moyen de savoir à quel point cela se produit pendant l'appel Start.

Running

Le thread appelle Thread.Sleep.

WaitSleepJoin

Le thread appelle Monitor.Wait sur un autre objet.

WaitSleepJoin

Le thread appelle Thread.Join sur un autre thread.

WaitSleepJoin

Un autre thread appelle Thread.Suspend.

SuspendRequested

Le thread répond à une requête Thread.Suspend.

Suspended

Un autre thread appelle Thread.Resume.

Running

Un autre thread appelle Thread.Abort.

AbortRequested

Le thread répond à Thread.Abort.

Aborted, puis Stopped

Comme l'état Running possède la valeur 0, il n'est pas possible d'effectuer un test binaire pour identifier cet état. En revanche, le test suivant (en pseudo-code) peut être utilisé :

if ((state & (Unstarted | Stopped)) == 0)   // implies Running   

Les threads peuvent être dans plusieurs états à tout moment donné. Par exemple, si un thread est bloqué sur un appel Monitor.Wait et qu'un autre thread appelle Abort sur ce même thread, le thread aura les états WaitSleepJoin et AbortRequested simultanément. Dans ce cas, dès que le thread retourne à partir de l'appel à Wait ou est interrompu, il reçoit ThreadAbortException.

Dès qu'un thread quitte l'état Unstarted suite à un appel à Start, il ne peut jamais retourner à l'état Unstarted. Un thread ne peut jamais non plus quitter l'état Stopped.

Voir aussi

Référence

ThreadAbortException

Thread

ThreadState

Autres ressources

Threading managé

Historique des modifications

Date

Historique

Motif

Mai 2011

Clarification supplémentaire de la relation entre la méthode Thread.Start et l'état Running.

Commentaires client.

Mars 2011

La relation entre la méthode Thread.Start et l'état Running a été clarifiée.

Résolution des bogues de contenu.