Escolha do Modelo de Threading

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.

Acesso a interfaces em apartamentos diferentes

Apartamentos Multithreaded

Problemas de threading do Servidor In-Process

Processos, Threads e Apartamentos

Single-Threaded e Comunicação Multithread

Single-Threaded Apartamentos