This documentation is archived and is not being maintained.

Thread States

The property Thread.ThreadState provides a bit mask that indicates the thread's current state. A thread is always in at least one of the possible states in the ThreadState enumeration, and can be in multiple states at the same time.

When you create a managed thread it is in the Unstarted state. The thread remains in the Unstarted state until it is moved into the started state by calling Thread.Start. Unmanaged threads that enter the managed environment are already in the started state. Once in the started state, there are a number of actions that can cause the thread to change states. The following table lists the actions that cause a change of state, along with the corresponding new state.

ActionResulting new state
Another thread calls Thread.Start.Unchanged
The thread responds to Thread.Start and starts running.Running
The thread calls Thread.Sleep.WaitSleepJoin
The thread calls Monitor.Wait on another object.WaitSleepJoin
The thread calls Thread.Join on another thread.WaitSleepJoin
Another thread calls Thread.Suspend.SuspendRequested
The thread responds to a Thread.Suspend request.Suspended
Another thread calls Thread.Resume.Running
Another thread calls Thread.Interrupt.Running
Another thread calls Thread.Abort.AbortRequested
The thread responds to a Thread.Abort.Aborted

Because the Running state has a value of 0, it is not possible to perform a bit test to discover this state. Instead, the following test (in pseudo-code) can be used:

if ((state & (Unstarted | Stopped)) == 0)   // implies Running   

Threads are often in more than one state at any given time. For example, if a thread is blocked from a Wait call and another thread calls Abort on that same thread, the thread will be in both the WaitSleepJoin and the AbortRequested state at the same time. In that case, as soon as the thread returns from the call to Wait or is interrupted, it will receive the ThreadAbortException.

Once a thread leaves the Unstarted state as the result of a call to Thread.Start, it can never return to the Unstarted state. A thread can never leave the Stopped state, either.

See Also

Threading | ThreadAbortException | Thread | ThreadState