Класс ThreadState определяет набор всех возможных состояний выполнения для потока. После создания потока и до завершения он находится по крайней мере в одном из состояний. Потоки, созданные в общеязыковой среде выполнения, изначально находятся в состоянии Unstarted, в то время как внешние потоки, приходящие в среду выполнения, находятся уже в состоянии Running. Потоки с состоянием Unstarted переходят в состояние Running при вызове метода Start. Не все комбинации значений ThreadState являются допустимыми; например, поток не может быть одновременно в состояниях Aborted и Unstarted.
В следующей таблице перечислены действия, вызывающие смену состояния.
Действие
Состояние Потока
Поток создается в среде CLR.
Unstarted
Поток вызывает метод Start.
Running
Поток начинает выполнение.
Running
Поток вызывает метод Sleep.
WaitSleepJoin
Поток вызывает метод Wait для другого объекта.
WaitSleepJoin
Поток вызывает метод Join для другого потока.
WaitSleepJoin
Другой поток вызывает метод Interrupt.
Running
Другой поток вызывает метод Suspend.
SuspendRequested
Поток отвечает на запрос метода Suspend.
Suspended
Другой поток вызывает метод Resume.
Running
Другой поток вызывает метод Abort.
AbortRequested
Поток отвечает на запрос метода Abort.
Stopped
Поток завершен.
Stopped
Начальное состояние потока (если это не главный поток), в котором он оказывается непосредственно после его создания – Unstarted. В этом состоянии он пребывает до тех пор, пока вызовом метода Start() он не будет переведён в состояние Running.
В дополнение к вышеперечисленным состояниям, существует также Background состояние, которое указывает, выполняется ли поток на фоне или на переднем плане.
Свойство Thread.ThreadState потока содержит текущее состояние потока. Для определения текущего состояния потока в приложении можно использовать битовые маски. Пример условного выражения:
Метод Thread.Abort был вызван для потока, но поток еще не получил задерживающийся объект System.Threading.ThreadAbortException, который будет пытаться завершить поток.
Background
Поток выполняется как фоновый поток, что является противоположным к приоритетному потоку. Это состояние контролируется заданием свойства Thread.IsBackground.
Running
Поток был запущен, он не заблокирован, и нет задерживающегося объекта ThreadAbortException.
Stopped
Процесс остановлен.
StopRequested
Поток запрашивается на остановку. Это только для внутреннего использования.
Suspended
Работа потока была приостановлена.
SuspendRequested
Запрашивается приостановка работы потока.
Unstarted
Метод Thread.Start не был вызван для потока.
WaitSleepJoin
Поток заблокирован в результате вызова к методам Wait, Sleep или Join.