Управляемые и неуправляемые потоки
Для синхронизации доступа к ресурсам COM-компоненты используют подразделения. Напротив, управляемые объекты используют синхронизированные области, примитивы синхронизации (например, мьютексы, блокировки и порты завершения), а также контексты синхронизации, обеспечивающие безопасность потоков при использовании любых общих ресурсов. Дополнительные сведение о потоковой модели .NET см. в разделе Управляемая поточность.
Для обеспечения взаимодействия при вызове COM-объекта среда CLR создает и инициализирует подразделение. Управляемый поток может создать и выполнить вход в однопотоковое подразделение, содержащее только один поток, или многопотоковое подразделение, содержащее один или несколько потоков. Если подразделение, созданное потоком, и подразделение COM, модель COM позволяет вызывающему потоку обращаться непосредственно к COM-объекту. Если подразделения несовместимы, модель COM создает совместимое подразделение и выполняет маршалинг всех вызовов через посредника в новом подразделении.
Среда выполнения вызывает CoInitializeEx, чтобы инициализировать подразделение COM либо как многопотоковое, либо как однопотоковое подразделение. В .NET Framework версии 2.0 управляемые потоки инициализируются как MTA, если состояние их подразделения не было установлено до запуска потока. Метод SetApartmentState или TrySetApartmentState используется, чтобы задать состояние подразделения до запуска потока.
В .NET Framework версии 2.0 основной поток приложения инициализируется как MTA, если к процедуре точки входа не применяется атрибут STAThreadAttribute.
Примечание |
---|
В платформе .NET Framework версий 1.0 и 1.1 можно было задать состояние подразделения после запуска потока с помощью свойства System.Threading.ApartmentState, что приводило к состоянию гонки.В .NET Framework версии 2.0 это не разрешено. |
При использовании некоторых моделей программирования для потока необходимо задать свойство STA. Например, чтобы Windows Forms могли инициализировать такие элементы, как перетаскивание, необходимо создать однопотоковое подразделение и выполнить вход в него.
Примечание |
---|
Если ни прокси и заглушка, ни библиотека типов не зарегистрированы, обращение к COM-объекту из управляемого кода может вызвать исключение InvalidCastException. |
В следующей таблице представлены значения перечисления ApartmentState и соответствующие вызовы инициализации подразделения COM.
Значение перечисления ApartmentState |
Инициализация подразделения COM |
---|---|
Многопотоковое подразделение |
CoInitializeEx(NULL, COINIT_MULTITHREADED) |
Однопотоковое подразделение |
CoIntializeEx(NULL, COINIT_APARTMENTTHREADED) |
Нет данных |
CoInitializeEx(NULL, COINIT_MULTITHREADED) |
Если COM-объект и управляемый поток находятся в несовместимых подразделениях, все вызовы объекта осуществляются через прокси, созданный моделью COM.
См. также
Основные понятия
Предоставление клиентам .NET Framework доступа к COM-компонентам
Предоставление COM-клиентам доступа к компонентам .NET Framework