Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A escolha do modelo de threading para um objeto depende da função do objeto. Um objeto que realiza extensiva E/S pode oferecer suporte a livre encadeamento, permitindo assim a máxima resposta aos clientes através de chamadas de interface durante a latência de E/S. Por outro lado, um objeto que interage com o utilizador pode suportar o threading em apartamento para sincronizar chamadas COM recebidas com as suas operações de janela.
É mais fácil suportar o threading de apartamentos em apartamentos de thread único porque o COM fornece sincronização por chamada. O suporte a multithreading livre é mais difícil porque o objeto deve implementar a sincronização; no entanto, a resposta aos clientes pode ser melhor porque a sincronização pode ser implementada para partes menores do código.
Tip
Guia rápido de decisão para clientes COM:
// UI thread or main thread with a message loop → STA
HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
// Background/worker thread with no message loop → MTA
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
Para servidores COM (DLLs no processo), defina o valor de registo ThreadingModel na chave InprocServer32:
-
Apartment— O objeto executa-se no STA do chamador (mais comum para objetos relacionados com interface de utilizador) -
Free— O objeto é executado na MTA -
Both— O objeto é executado no apartment do chamador (mais adequado para objetos de uso geral) -
Neutral— O objeto é executado no Apartamento Neutro (apenas no COM+)
Se tiver dúvidas, comece com Both e certifique-se de que o seu objeto é seguro em termos de threads. Isto reduz o marshaling entre apartamentos ao permitir que o COM crie o objeto no apartamento do chamador, embora o marshaling ainda possa ocorrer para callbacks entre apartamentos ou para acesso por parte de outros apartamentos.
Tópicos relacionados
-
Problemas de threading do Servidor In-Process