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


Приостановка и возобновление потоков

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

Самыми распространенными способами синхронизации действий в потоках является блокировка и освобождения потоков или блокировка объектов или областей кода. Дополнительные сведения об этих блокировках и механизмах блокировки см. в разделе Обзор примитивов синхронизации.

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

Метод Thread.Sleep

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

Вызов метода Thread.Sleep с аргументом Timeout.Infinite переводит поток в состояние ожидания до тех пор, пока он не будет прерван другим потоком, который вызовет метод Thread.Interrupt или пока он не будет прерван перегрузкой Thread.Abort.

Прерывание потоков

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

tttdef8x.alert_note(ru-ru,VS.90).gifПримечание.

Если целевой поток не заблокирован при вызове метода Thread.Interrupt, поток не прерывается до блокировки. Если поток никогда не блокирует, он может завершиться, не будучи прерванным.

Если ожидание является управляемым, методы Thread.Interrupt и Thread.Abort незамедлительно выводят поток из спящего режима. В случае неуправляемого ожидания (например, если при платформенном вызове функции Win32 WaitForSingleObject) методы и перегрузки Thread.Interrupt и Thread.Abort могут управлять потоком до его возврата или входа в управляемый код. В управляемом коде это поведение выглядит следующим образом:

Приостановка и возобновление (устарело)

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

В .NET Framework версии 2.0 методы Thread.Suspend и Thread.Resume считаются устаревшими и будут удалены в будущих выпусках.

Поток можно также приостановить, вызвав метод Thread.Suspend. Если поток вызывает метод Thread.Suspend для себя, вызов блокируется до тех пор, пока поток не будет возобновлен другим потоком. Когда поток вызывает метод Thread.Suspend для другого потока, вызов не блокируется, и это приводит к приостановке другого потока. Вызов метода Thread.Resume прерывает выводит другой поток из приостановленного состояния и заставляет этот поток продолжить выполнение независимо от количества вызовов метода Thread.Suspend. Например, если Thread.Suspend вызывался последовательно пять раз, а затем был вызван Thread.Resume, выполнение потока будет возобновлено после вызова метода Thread.Resume.

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

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

Обычно методы Thread.Suspend и Thread.Resume не используются в приложениях, и их не следует путать с механизмами синхронизации. Поскольку методы Thread.Suspend и Thread.Resume не учитывают взаимодействие контролируемого потока, они оказывают сильное влияние и могут вызвать серьезные ошибки в приложении, например взаимоблокировки (если приостановлен поток, владеющий ресурсом, к которому обращается другой поток).

Для улучшения производительности некоторые приложения не контролируют приоритетность потоков. Для этого следует использовать свойство Priority, а не метод Thread.Suspend.

См. также

Основные понятия

Обзор примитивов синхронизации

Метод Thread.Suspend, сборка мусора и безопасные точки

Ссылки

Thread

ThreadInterruptedException

ThreadAbortException

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

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

Использование потоков и работа с потоками