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