Stati dei thread gestiti
La proprietà Thread.ThreadState fornisce una maschera di bit che indica lo stato corrente del thread. Un thread si trova sempre in almeno uno dei possibili stati nell'enumerazione ThreadState e può trovarsi in più stati contemporaneamente.
Importante |
---|
Lo stato del thread è rilevante solo in alcuni scenari di debug.È opportuno che nel codice non venga mai utilizzato lo stato del thread per sincronizzare le attività dei thread. |
Al momento della creazione, un thread gestito si trova nello stato ThreadState.Unstarted. Il thread rimane nello stato Unstarted finché non viene chiamato il metodo Thread.Start, che inserisce il thread nello stato Running, in modo che il sistema operativo possa programmarlo per l'esecuzione.
I thread non gestiti che entrano nell'ambiente gestito sono già avviati. Dopo che un thread è stato avviato, il suo stato può cambiare in seguito a numerose azioni. Nella tabella che segue sono elencate le azioni che causano il cambiamento di stato e il nuovo stato corrispondente.
Azione |
Nuovo stato ottenuto |
---|---|
Viene chiamato il costruttore per la classe Thread. |
|
Un altro thread chiama il metodo Thread.Start sul nuovo thread e la chiamata restituisce un risultato. |
|
Il thread chiama Thread.Sleep. |
|
Il thread chiama Monitor.Wait su un altro oggetto. |
|
Il thread chiama Thread.Join su un altro thread. |
|
Un altro thread chiama Thread.Suspend. |
|
Il thread risponde a una richiesta Thread.Suspend. |
|
Un altro thread chiama Thread.Resume. |
|
Un altro thread chiama Thread.Abort. |
|
Il thread risponde a Thread.Abort. |
Poiché lo stato Running ha un valore pari a 0, non è possibile eseguire un test dei bit per individuare questo stato. Può essere invece utilizzato il test che segue, in pseudo-codice:
if ((state & (Unstarted | Stopped)) == 0) // implies Running
I thread si trovano spesso in più di uno stato in un determinato momento. Se, ad esempio, un thread è bloccato su una chiamata Monitor.Wait e un altro thread chiama Abort sullo stesso thread, il thread si troverà contemporaneamente nello stato WaitSleepJoin e nello stato AbortRequested. In tal caso, non appena terminerà la chiamata a Wait o verrà interrotto, il thread riceverà ThreadAbortException.
Una volta modificato lo stato Unstarted in seguito a una chiamata a Start, il thread non potrà più tornare allo stato Unstarted. Un thread non può mai modificare lo stato Stopped.
Vedere anche
Riferimenti
Altre risorse
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Maggio 2011 |
Ulteriore chiarimento relativo alla relazione tra il metodo Thread.Start e lo stato Running. |
Commenti e suggerimenti dei clienti. |
Marzo 2011 |
Chiarimento relativo alla relazione tra il metodo Thread.Start e lo stato Running. |
Correzione di bug nel contenuto. |