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. |
|
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.Suspend. |
|
Un altro thread chiama Thread.Abort. |
|
Il thread risponde a Thread.Abort. |
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.