Система Orphus
Версия для печати

Работа с потоками в C#

Автор: Joseph Albahari
Перевод: Алексей Кирюшкин
The RSDN Group

Источники: Threading in C#
базируется на книге
Joseph Albahari Ben Albahari "C# 3.0 in a Nutshell"

Материал предоставил: RSDN Magazine #2-2007
Опубликовано: 27.06.2007
Исправлено: 15.04.2009
Версия текста: 1.0
3. Работа с потоками
Апартаменты и Windows Forms
BackgroundWorker
ReaderWriterLock
Пулы потоков
Асинхронные делегаты
Таймеры
Локальные хранилища
4. Дополнительные материалы
Неблокирующая синхронизация
Wait и Pulse
Suspend и Resume
Аварийное завершение потоков

3. Работа с потоками

Апартаменты и Windows Forms

Потоковые апартаменты – это автоматический потокобезопасный режим, тесно связанный с COM, предыдущей технологией Microsoft. В то время как .NET в основном свободен от унаследованных потоковых моделей, временами они все еще необходимы, из-за потребности работать с устаревшими API. Потоковые апартаменты особенно важны в Windows Forms, так как Windows Forms по большей части используют или оборачивают Win32 API вместе с его апартаментами.

Апартамент – логический “контейнер” для потоков. Апартаменты бывают двух видов – “single” (однопоточные) и “multi” (многопоточные). Однопоточный апартамент может содержать только один поток, многопоточный – любое количество потоков. Однопоточная модель используется чаще и имеет большие возможности для взаимодействия.

Так же, как потоки, апартаменты могут содержать в себе объекты. Когда объект создается в каком-либо апартаменте, он остается там на всю жизнь, навсегда прикованный к апартаменту и его потоку(-ам). Это напоминает объект в контексте синхронизации .NET, за исключением того, что контекст синхронизации не владеет и не содержит потоков. Любой поток может вызвать любой объект в любом контексте синхронизации – с обязательным ожиданием эксклюзивной блокировки. Объекты же, входящие в какой-либо апартамент, могут быть вызваны только потоком этого апартамента.

Вообразите себе библиотеку, где каждая книга представляет собой объект. Выносить книги из библиотеки нельзя, они должны оставаться там всю жизнь. Добавим сюда человека, который будет представлять собой поток.

Библиотека-контекст синхронизации позволит войти любому человеку, но только одному одновременно. Если людей больше – перед библиотекой образуется очередь.

Библиотека-апартамент имеет свой штат – одного библиотекаря для однопоточной библиотеки или целую группу для многопоточной. Никто, кроме штатных библиотекарей, не может войти в библиотеку. Клиент, желающий провести исследование, должен посигналить библиотекарю, а затем попросить его выполнить задание! Вызов библиотекаря называется маршалингом – клиент выполняет маршалинг своего вызова штатному сотруднику. Маршалинг выполняется автоматически и реализуется через прокачку сообщений – в Windows Forms этот механизм постоянно следит за событиями клавиатуры и мыши от операционной системы. Если обработка не успевает за новыми сообщениями, создается очередь сообщений, обрабатываемая в порядке поступления.

Назначение типа апартамента

Control.Invoke

BackgroundWorker

ReaderWriterLock

Пулы потоков

Асинхронные делегаты

Асинхронные методы

Асинхронные события

Таймеры

Локальные хранилища

4. Дополнительные материалы

Неблокирующая синхронизация

Атомарность и Interlocked

Барьеры в памяти и асинхронная изменчивость (volatility)

Wait и Pulse

Определение Wait и Pulse

Переключение блокировки

Задание таймаута

Очередь ожидания и PulseAll

Использование Pulse и Wait

Обобщение модели использования Wait и Pulse

Очередь поставщик/потребитель

Про экономию сигналов

Pulse или PulseAll?

Использование таймаутов для Wait

Гонки и подтверждения

Имитация Wait Handle

Ожидание стыковки

Wait и Pulse vs. Wait Handles

Suspend и Resume

Аварийное завершение потоков

Сложности с Thread.Abort

Завершение домена приложений

Завершение процессов


Полная версия этой статьи опубликована в журнале RSDN Magazine #2-2007. Информацию о журнале можно найти здесь