Share via


États des threads managés

Mise à jour : novembre 2007

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 importante :

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 Unstarted. Le thread conserve l'état Unstarted jusqu'à ce qu'il soit déplacé vers l'état Started par le système d'exploitation. Un appel à Start permet au système d'exploitation de savoir que le thread peut commencer, il ne change pas l'état du thread.

Les threads non managés qui entrent l'environnement managé portent l'état Started. Une fois à l'état démarré, il existe un nombre d'actions qui peuvent faire changer le thread d'é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

Un autre thread appelle Thread.Start.

Inchangé

Le thread répond à Thread.Start et démarre son exécution.

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

WaitSleepJoin

Un autre thread appelle Thread.Suspend.

SuspendRequested

Le thread répond à une demande Thread.Suspend.

Suspended

Un autre thread appelle Thread.Resume.

Running

Un autre thread appelle Thread.Suspend.

Running

Un autre thread appelle Thread.Abort.

AbortRequested

Le thread répond à Thread.Abort.

Aborted

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 sera dans l'état 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é