ThreadState define un conjunto de todos los estados de ejecución posibles para los subprocesos. Una vez que se crea un subproceso, éste siempre se encuentra en al menos uno de los estados hasta que termina. Los subprocesos creados dentro de Common Language Runtime se encuentran inicialmente en estado Unstarted, mientras que los subprocesos externos que entran en el motor en tiempo de ejecución ya se encuentran en estado Running. Para que un subproceso Unstarted pase al estado Running, hay que llamar a Start. No todas las combinaciones de valores de ThreadState son válidas; por ejemplo, un subproceso no puede encontrarse en estado Aborted y estado Unstarted a la vez.
Importante: |
|---|
| Hay dos enumeraciones de estado de subprocesos, System.Threading.ThreadState y System.Diagnostics.ThreadState. Las enumeraciones del estado de los subprocesos sólo son de interés en algunos escenarios de depuración. El código nunca debe utilizar el estado de los subprocesos para sincronizar las actividades de los subprocesos. |
En la siguiente tabla se muestran las acciones que provocan un cambio de estado.
| Acción | ThreadState |
| Se crea un subproceso dentro de Common Language Runtime. | Unstarted |
| Un subproceso llama a Start | Unstarted |
| El subproceso comienza a ejecutarse. | Running |
| El subproceso llama a Sleep | WaitSleepJoin |
| El subproceso llama a Wait en otro objeto. | WaitSleepJoin |
| El subproceso llama a Join en otro subproceso. | WaitSleepJoin |
| Otro subproceso llama a Interrupt | Running |
| Otro subproceso llama a Suspend | SuspendRequested |
| El subproceso responde a una solicitud Suspend. | Suspended |
| Otro subproceso llama a Resume | Running |
| Otro subproceso llama a Abort | AbortRequested |
| El subproceso responde a una solicitud Abort. | Stopped |
| Finaliza un subproceso. | Stopped |
Además de los estados anteriormente mencionados, también existe el estado Background, que indica si el subproceso está ejecutándose en primer plano o en segundo plano.
En un momento dado, el subproceso puede encontrarse en más de un estado. Por ejemplo, si un subproceso se bloquea en una llamada a Wait, y otro subproceso llama a Abort en el subproceso bloqueado, el subproceso bloqueado se encontrará en estado WaitSleepJoin y en estado AbortRequested al mismo tiempo. En tal caso, en cuanto el subproceso se devuelva a partir de la llamada a Wait o en cuanto se interrumpa, recibirá la excepción ThreadAbortException para que comience su anulación.
La propiedad Thread.ThreadState de un subproceso proporciona el estado actual de un subproceso. Las aplicaciones deben utilizar una máscara de bits para determinar si se está ejecutando un subproceso. Como el valor de Running es cero (0), hay que comprobar si se está ejecutando un subproceso que utilice código de C# de tipo (myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0 o código de Visual Basic de tipo (myThread.ThreadState And (ThreadState.Stopped Or ThreadState.Unstarted)) = 0.