É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. |
|
Le thread appelle Thread.Sleep. |
|
Le thread appelle Monitor.Wait sur un autre objet. |
|
Le thread appelle Thread.Join sur un autre objet. |
|
Un autre thread appelle Thread.Suspend. |
|
Le thread répond à une demande Thread.Suspend. |
|
Un autre thread appelle Thread.Resume. |
|
Un autre thread appelle Thread.Suspend. |
|
Un autre thread appelle Thread.Abort. |
|
Le thread répond à Thread.Abort. |
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.