Compartilhar via


Modelos de Rosqueamento COM+

Os modelos de threading COM+ são projetados em torno de uma coleção de objetos chamada apartamento. Um apartamento é uma coleção de contextos contidos em um processo, como mostrado na ilustração a seguir.

Diagram that shows a collection of contexts in an activity, within an apartment, within a process.

As chamadas dentro de um apartamento são diretas, enquanto as chamadas entre apartamentos (fora do processo) são indiretas e exigem proxy e código de stub. Os apartamentos permitem objetos com diferentes propriedades de sincronização e reentrância e têm duas categorias: single-threaded e multithreaded. Os objetos em um apartamento de thread único (STA) são executados no thread específico no qual foram criados. Os STAs permitem que apenas um método seja executado por vez. Eles são projetados para interfaces de usuário e dependem da fila de mensagens do Microsoft Windows para processar chamadas de entrada.

Objetos em um apartamento multithreaded (MTA) são executados em qualquer thread e permitem que qualquer número de métodos ocorra simultaneamente. Os MTAs suportam a reentrada implicitamente.

As classes COM+ são marcadas com uma propriedade ThreadingModel que permite que COM+ crie o objeto no apartamento apropriado. Para determinar em qual apartamento um objeto é criado, CoCreateInstance usa a propriedade ThreadingModel.

Os threads devem chamar CoInitializeEx antes de poderem usar COM+. Isso os cria dentro do apartamento e do contexto corretos. O apartamento de thread principal é determinado como sendo o primeiro STA chamado por CoInitializeEx. Isso geralmente está associado ao fio condutor de um processo. CoInitializeEx indica o tipo de apartamento exigido pelo thread definindo os seguintes sinalizadores:

  • COINIT_MULTITHREADED—Localiza o thread no único apartamento multithreaded.
  • COINIT_APARTMENTTHREADED—Coloca o thread em um novo STA.

Os tópicos a seguir nesta seção fornecem mais informações sobre como usar modelos de threading e apartamentos em COM+:

Processos, threads e apartamentos

ThreadingModel