Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La elección del modelo de subprocesos para un objeto depende de la función de este. Un objeto que realice un gran volumen de E/S podría admitir subprocesos libres para proporcionar la máxima respuesta a los clientes, permitiendo llamadas a la interfaz durante la latencia de E/S. Por otro lado, un objeto que interactúe con el usuario podría admitir subprocesos de apartamento para sincronizar las llamadas COM entrantes con sus operaciones de ventana.
Es más fácil admitir subprocesos de apartamento en apartamentos de un solo subproceso, ya que COM proporciona sincronización por cada llamada. Admitir el free-threading es más difícil porque el objeto debe implementar la sincronización; sin embargo, la respuesta a los clientes puede ser mejor, ya que la sincronización se puede implementar para secciones de código más pequeñas.
Tip
Guía de decisión rápida 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 los servidores COM (DLL en proceso), configura el valor de registro ThreadingModel bajo la clave InprocServer32:
-
Apartment— El objeto se ejecuta en el STA del autor de la llamada (más común para los objetos relacionados con la interfaz de usuario) -
Free: el objeto se ejecuta en el MTA. -
Both— El objeto se ejecuta en el apartamento del autor de la llamada (lo mejor para objetos de uso general) -
Neutral— El objeto se ejecuta en el apartamento neutro (solo COM+)
En caso de duda, empieza con Both y asegúrate de que tu objeto sea seguro para subprocesos. Esto reduce la serialización entre apartamentos al permitir que COM cree el objeto en el apartamento del llamante, aunque la serialización puede seguir produciéndose en el caso de devoluciones de llamada entre apartamentos o de acceso desde otros apartamentos.
Temas relacionados