Состояния управляемых потоков
Обновлен: Ноябрь 2007
Свойство Thread.ThreadState предоставляет битовую маску, которая указывает текущее состояния потока. Поток постоянно находится, по крайней мере, в одном из состояний, указанных в перечислении ThreadState и может иметь несколько состояний одновременно.
Важное примечание. |
---|
Состояние потока используется только в некоторых сценариях отладки. Не следует использовать состояния потоков в коде для синхронизации действий потоков. |
При создании управляемого потока он находится в состоянии Unstarted. Поток остается в состоянии Unstarted, пока не будет перемещен в запущенное состояние операционной системой. Вызов Start позволяет операционной системе определить, можно ли запустить поток, при этом состояние потока не изменяется.
Неуправляемые потоки, которые входят в управляемую среду, уже находятся в запущенном состоянии. Если поток находится в запущенном состоянии, его состояние можно изменить, совершив с ним определенные действия. В следующей таблице представлены действия, изменяющие состояние потока, а также его новые состояния.
Действие |
Новое состояние |
---|---|
Другой поток вызывает метод Thread.Start |
Без изменений |
Поток отвечает методу Thread.Start и запускается. |
|
Поток вызывает метод Thread.Sleep |
|
Поток вызывает метод Monitor.Wait другого объекта. |
|
Поток вызывает метод Thread.Join другого потока. |
|
Другой поток вызывает метод Thread.Suspend |
|
Поток отвечает на запрос Thread.Suspend. |
|
Другой поток вызывает метод Thread.Resume |
|
Другой поток вызывает метод Thread.Suspend |
|
Другой поток вызывает метод Thread.Abort |
|
Поток отвечает методу Thread.Abort. |
Поскольку состоянию Runningсоответствует значение 0, для выяснения этого состояния невозможно применять поразрядную проверку. Вместо этого можно использовать следующий тест (написанный на псевдокоде):
if ((state & (Unstarted | Stopped)) == 0) // implies Running
Как правило, поток одновременно имеет более одного состояния. Например, если поток заблокируется по вызову метода Monitor.Wait и другой поток вызывает метод Abort того же потока, то поток будет находиться в состояниях WaitSleepJoin и AbortRequested одновременно. В этом случае, как только возвратит значение вызванный потоком метод Wait или его работа будет прервана, поток получит исключение ThreadAbortException.
Если поток был выведен из состояния Unstarted в результате вызова метода Start, он не может быть возвращен в состояние Unstarted. Поток никогда не может выйти из состояния Stopped.