Condividi tramite


Stati dei thread gestiti

Aggiornamento: novembre 2007

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 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 Unstarted. Il thread rimane nello stato Unstarted finché non viene fatto passare allo stato Started dal sistema operativo. La chiamata al metodo Start consente di comunicare al sistema operativo che il thread può essere avviato, non determina un cambiamento dello stato del thread.

I thread non gestiti che entrano nell'ambiente gestito si trovano già nello stato Started. Una volta in questo stato, sono disponibili diverse azioni che possono causare il cambiamento di stato del thread. Nella tabella che segue sono elencate le azioni che causano il cambiamento di stato e il nuovo stato corrispondente.

Azione

Nuovo stato ottenuto

Un altro thread chiama Thread.Start.

Unchanged

Il thread risponde a Thread.Start e viene avviata l'esecuzione.

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

Running

Un altro thread chiama Thread.Abort.

AbortRequested

Il thread risponde a Thread.Abort.

Aborted

Poiché lo stato Runningha 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. Ad esempio, un thread bloccato su una chiamata Monitor.Wait, e sul quale un altro thread chiama Abort, si troverà contemporaneamente nello stato WaitSleepJoin e 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