Шрифт:
На рис. 14.4 показан вывод этого приложения.
Рис. 14.4. Передача и получение пользовательских данных состояния
Чудесно! Теперь, когда вы понимаете, что делегат .NET можно использовать для автоматического запуска вторичного потока выполнения, обрабатывающего асинхронный вызов метода, давайте обратим внимание на возможности непосредственного взаимодействия о потоками с помощью пространства имен System.Threading.
Исходный код. Проект AsyncCallbackDelegate размещен в подкаталоге, соответствующем главе 14.
Пространство имен System.Threading
В рамках платформы .NET пространство имен System.Threading предлагает ряд типов, позволяющих строить многопоточные приложения. Вдобавок к типам, с помощью которых можно взаимодействовать с отдельными потоками CLR, в этом пространстве имен определены также типы, обеспечивающие доступ к поддерживаемому средой CLR пулу потоков, простой (не имеющий графического интерфейса) класс Timer и множество типов, предназначенных для поддержки синхронизированного доступа к разделяемым ресурсам. Описания основных членов этого пространства имен приведены табл. 14.1. (Не забывайте о том, что подробности всегда можно найти в документации .NET Framework 2.0 SDK.)
Таблица 14.1. Подборка типов пространства имен System.Threading
Тип | Описание |
---|---|
Interlocked | Предлагает атомарные операции для типов, открытых для множества потоков. |
Monitor | Обеспечивает синхронизацию объектов потоков с помощью блокировок и ожиданий/сигналов, ключевое слово C# lock использует тип Monitor в фоновом режиме |
Mutex | Примитив синхронизации, используемый для синхронизации взаимодействия между границами доменов приложения |
ParameterizedThreadStart | Делегат (появившийся только в .NET 2.0), позволяющий потоку вызывать методы с любым числом аргументов |
Semaphore | Позволяет ограничить число потоков, которые могут иметь конкурентный доступ к ресурсу или определенному типу ресурсов |
Thread | Представляет поток, выполняющийся в среде CLR. С помощью этого типа можно создавать дополнительные потоки в оригинальном домене приложения |
ThreadPool | Позволяет взаимодействовать о пулам потоков, управляемым средой CLR в рамках данного процесса |
ThreadPriority | Перечень, представляющий уровень приоритета потока (Highest, Normal и т.д.) |
ThreadStart | Делегат, используемый для указания метода, вызываемого для данного потока. В отличие от ParameterizedThreadStart, целевые методы ThreadStart должны соответствовать фиксированному шаблону |
ThreadState | Перечень, указывающий состояния, допустимые для данного потока (Running, Aborted и т.д.) |
Timer | Обеспечивает механизм выполнения метода через заданные интервалы времени |
TimerCallback | Делегат, используемый в совокупности с типами Timer |
Класс System.Threading.Thread
Основным в пространстве имен System.Threading является класс Thread. Этот класс представляет собой объектный контейнер отдельной ветви выполнения в конкретном домене приложения. Он определяет ряд методов (как статических, так и общедоступных), которые позволяют создавать новые потоки в текущем домене приложения, а также приостанавливать, останавливать и завершать отдельные потоки. Рассмотрите описания основных статических членов, приведенные в табл. 14.2.
Таблица 14.2. Основные статические члены типа Thread
Статический член | Описание |
---|---|
CurrentContext | Доступное только для чтения свойство, возвращающее контекст, в котором выполняется поток в настоящий момент |
CurrentThread | Доступное только для чтения свойство, возвращающее ссылку на выполняемый в настоящий момент поток |
GetDomain GetDomainID | Методы, возвращающие ссылки на текущий домен приложения или идентификатор домена, в котором выполняется текущий поток |
Sleep | Метод, приостанавливающий выполнение текущего потока на указанное время |
Класс Thread также поддерживает набор членов уровня экземпляра. Описания некоторых из этих членов приведены в табл. 14.3.
Таблица 14.3. Члены уровня экземпляра типа Thread
Член уровня экземпляра | Описание |
---|---|
IsAlive | Возвращает логическое значение, сообщающее о том, запущен ли данный поток |
IsBackground | Читает или устанавливает значение, сообщающее о том, является ли данный поток "фоновым" (дополнительные подробности будут предложены чуть позже) |
Name | Позволяет задать понятное строковое имя потока |
Priority | Читает или устанавливает приоритет потока, которому может быть назначено значение из перечня ThreadPriority |
ThreadState | Читает информацию о состоянии потока, которая может принимать значения из перечня ThreadState |
Abort | Дает указание среде CLR завершить поток как можно быстрее |
Interrupt | Выводит (например, путем активизации) текущий поток из периода ожидания |
Join | Блокирует вызывающий поток до завершения указанного потока (того, для которого вызывается Join) |
Resume | Возобновляет выполнение приостановленного ранее потока |
Start | Дает указание среде CLR как можно быстрее начать выполнение потока |
Suspend | Приостанавливает выполнение потока. Если поток уже приостановлен, вызов Suspend игнорируется |
Получение информации об отдельном потоке
Напомним, что точка входа компоновочного блока (т.е. метод Main) при выполнении оказывается в первичном потоке. Чтобы привести типичный пример использования типа Thread, предположим, что у нас есть новое консольное приложение с именем ThreadState. Вы знаете, что статическое свойство Thread.СurrentThread позволяет получить тип Thread, представляющий выполняемый в настоящий момент поток. Получив текущий поток, вы можете вывести на экран различную информацию о потоке.