Поделиться через


Состояния управляемых потоков

Обновлен: Ноябрь 2007

Свойство Thread.ThreadState предоставляет битовую маску, которая указывает текущее состояния потока. Поток постоянно находится, по крайней мере, в одном из состояний, указанных в перечислении ThreadState и может иметь несколько состояний одновременно.

d6122999.alert_caution(ru-ru,VS.90).gifВажное примечание.

Состояние потока используется только в некоторых сценариях отладки. Не следует использовать состояния потоков в коде для синхронизации действий потоков.

При создании управляемого потока он находится в состоянии Unstarted. Поток остается в состоянии Unstarted, пока не будет перемещен в запущенное состояние операционной системой. Вызов Start позволяет операционной системе определить, можно ли запустить поток, при этом состояние потока не изменяется.

Неуправляемые потоки, которые входят в управляемую среду, уже находятся в запущенном состоянии. Если поток находится в запущенном состоянии, его состояние можно изменить, совершив с ним определенные действия. В следующей таблице представлены действия, изменяющие состояние потока, а также его новые состояния.

Действие

Новое состояние

Другой поток вызывает метод Thread.Start

Без изменений

Поток отвечает методу Thread.Start и запускается.

Running

Поток вызывает метод Thread.Sleep

WaitSleepJoin

Поток вызывает метод Monitor.Wait другого объекта.

WaitSleepJoin

Поток вызывает метод Thread.Join другого потока.

WaitSleepJoin

Другой поток вызывает метод Thread.Suspend

SuspendRequested

Поток отвечает на запрос Thread.Suspend.

Suspended

Другой поток вызывает метод Thread.Resume

Running

Другой поток вызывает метод Thread.Suspend

Running

Другой поток вызывает метод Thread.Abort

AbortRequested

Поток отвечает методу Thread.Abort.

Aborted

Поскольку состоянию Runningсоответствует значение 0, для выяснения этого состояния невозможно применять поразрядную проверку. Вместо этого можно использовать следующий тест (написанный на псевдокоде):

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

Как правило, поток одновременно имеет более одного состояния. Например, если поток заблокируется по вызову метода Monitor.Wait и другой поток вызывает метод Abort того же потока, то поток будет находиться в состояниях WaitSleepJoin и AbortRequested одновременно. В этом случае, как только возвратит значение вызванный потоком метод Wait или его работа будет прервана, поток получит исключение ThreadAbortException.

Если поток был выведен из состояния Unstarted в результате вызова метода Start, он не может быть возвращен в состояние Unstarted. Поток никогда не может выйти из состояния Stopped.

См. также

Ссылки

ThreadAbortException

Thread

ThreadState

Другие ресурсы

Управляемая поточность