Gerenciado e Threading

Componentes COM usam apartments para sincronizar o acesso aos recursos. Em contraste, os objetos gerenciados usam regiões sincronizados, primitivos de sincronização, como exclusões mútuas, bloqueios e portas de conclusão e contextos sincronizados para garantir que todos os recursos compartilhados são usados de maneira segura para thread. Para obter informações adicionais sobre o.NET o modelo de threading, consulte Threads gerenciadas.

Para interoperabilidade, o common language runtime cria e inicializa um apartamento ao chamar um objeto COM. Um segmento gerenciado pode criar e inserir um single-threaded apartment (STA) que contém apenas um thread ou em um compartimento com vários segmentos (MTA) que contém um ou mais threads. Quando um compartimento COM e um apartamento gerado pelo thread forem compatíveis, COM permite fazer chamadas diretamente para o objeto COM o segmento de chamada. Se o apartments forem incompatíveis, COM cria um compartimento compatível e controla todas as chamadas através de um proxy no novo compartimento.

As chamadas de tempo de execução CoInitializeEx para inicializar o apartamento COM como um MTA ou um apartamento STA. No.NET Framework versão 2.0, os threads gerenciados são inicializados como MTA se o seu estado apartment não foi definido antes de se iniciar o thread. Use o SetApartmentState ou TrySetApartmentState método para definir o estado apartment antes de iniciar o thread.

No.NET Framework versão 2.0, o thread principal do aplicativo é inicializado como MTA , a menos que o STAThreadAttribute é aplicado para a entrada de ponto de procedimento.

Observação

No.NET Framework versões 1.0 e 1.1, foi possível definir o estado de apartamento, depois que o segmento estava sendo executado usando o System.Threading.ApartmentState propriedade; Isso criou uma condição de corrida.No.NET Framework versão 2.0, isso não é permitido.

Alguns modelos de programação requerem que você defina a STA propriedade em um thread. Por exemplo, para formulários do Windows inicializar os elementos como, por exemplo, arrastar e soltar, você deve criar e inserir single-threaded apartment.

Observação

Se o proxy e stub nem a biblioteca de tipos é registrada, um InvalidCastException pode ocorrer quando a chamada de um objeto COM do código gerenciado.

A tabela a seguir listas os ApartmentState valores de enumeração e mostra a chamada de inicialização de apartment COM comparável.

Valor de enumeração ApartmentState

Inicialização de apartment COM

MTA

CoInitializeEx (NULL, COINIT_MULTITHREADED)

STA

CoIntializeEx (NULL, COINIT_APARTMENTTHREADED)

Desconhecido

CoInitializeEx (NULL, COINIT_MULTITHREADED)

Sempre que o objeto COM e o thread gerenciado no apartments incompatíveis, todas as chamadas do objeto são feitas através de um proxy criado por COM.

Consulte também

Conceitos

Expondo componentes COM para o.NET Framework

Expondo.NET Framework para COM

Outros recursos

Interoperabilidade de COM avançadas