Condividi tramite


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.

Nota importanteImportante

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.

Unstarted

Un altro thread chiama il metodo Thread.Start sul nuovo thread e la chiamata restituisce un risultato.

NotaNota
Il metodo Start non restituisce un risultato fino a quando il nuovo thread si trova nello stato Running.Non è possibile sapere a che punto questo si verifica durante la chiamata a Start.

Running

Il thread chiama Thread.Sleep.

WaitSleepJoin

Il thread chiama Monitor.Wait su un altro oggetto.

WaitSleepJoin

Il thread chiama Thread.Join su un altro thread.

WaitSleepJoin

Un altro thread chiama Thread.Suspend.

SuspendRequested

Il thread risponde a una richiesta Thread.Suspend.

Suspended

Un altro thread chiama Thread.Resume.

Running

Un altro thread chiama Thread.Abort.

AbortRequested

Il thread risponde a Thread.Abort.

Aborted, quindi Stopped

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

ThreadAbortException

Thread

ThreadState

Altre risorse

Threading gestito

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.