¿Podrías explicar STA y MTA?
¿Puedes explicar STA y MTA con tus propias palabras?
Además, ¿qué son los subprocesos de apartamentos y pertenecen únicamente a COM? Si es así, ¿por qué?
El modelo de subprocesos COM se denomina modelo de "apartamento", donde el contexto de ejecución de los objetos COM inicializados está asociado con un solo subproceso (Single Thread Apartment) o con muchos subprocesos (Multi Thread Apartment). En este modelo, un objeto COM, una vez inicializado en un apartamento, forma parte de ese apartamento durante su tiempo de ejecución.
El modelo STA se utiliza para objetos COM que no son seguros para subprocesos. Eso significa que no manejan su propia sincronización. Un uso común de esto es un componente de interfaz de usuario. Entonces, si otro hilo necesita interactuar con el objeto (como presionar un botón en un formulario), entonces el mensaje se dirige al hilo de STA. El sistema de bombeo de mensajes de Windows Forms es un ejemplo de esto.
Si el objeto COM puede manejar su propia sincronización, entonces se puede usar el modelo MTA donde se permite que varios subprocesos interactúen con el objeto sin llamadas ordenadas.
Todo depende de cómo se manejan las llamadas a objetos y de cuánta protección necesitan. Los objetos COM pueden solicitar al tiempo de ejecución que los proteja contra ser llamados por múltiples subprocesos al mismo tiempo; aquellos que no lo hacen pueden ser llamados simultáneamente desde diferentes subprocesos, por lo que deben proteger sus propios datos.
Además, también es necesario que el tiempo de ejecución evite que una llamada a un objeto COM bloquee la interfaz de usuario, si se realiza una llamada desde un subproceso de la interfaz de usuario.
Un apartamento es un lugar donde viven los objetos y contienen uno o más hilos. El apartamento define lo que sucede cuando se realizan llamadas. Las llamadas a objetos en un apartamento se recibirán y procesarán en cualquier hilo de ese apartamento, con la excepción de que una llamada realizada por un hilo que ya está en el apartamento correcto se procesa por sí mismo (es decir, una llamada directa al objeto).
Los subprocesos pueden estar en un apartamento de un solo subproceso (en cuyo caso son el único subproceso en ese apartamento) o en un apartamento de subprocesos múltiples. Especifican cuál cuando el hilo inicializa COM para ese hilo.
La STA tiene como objetivo principal la compatibilidad con la interfaz de usuario, que está vinculada a un hilo específico. Una STA recibe notificaciones de llamadas a procesar al recibir un mensaje de ventana a una ventana oculta; cuando realiza una llamada saliente, inicia un bucle de mensajes modal para evitar que se procesen otros mensajes de ventana. Puede especificar un filtro de mensajes para que se llame, de modo que su aplicación pueda responder a otros mensajes.
Por el contrario, todos los subprocesos del MTA comparten un único MTA para el proceso. COM puede iniciar un nuevo subproceso de trabajo para manejar una llamada entrante si no hay subprocesos disponibles, hasta un límite del grupo. Los hilos que realizan llamadas salientes simplemente se bloquean.
Para simplificar, consideraremos sólo los objetos implementados en DLL, que anuncian en el registro lo que admiten, estableciendo el ThreadingModel
valor de la clave de su clase. Hay cuatro opciones:
- Hilo principal (
ThreadingModel
valor no presente). El objeto se crea en el subproceso principal de la interfaz de usuario del host y todas las llamadas se dirigen a ese subproceso. La fábrica de clases solo será llamada en ese hilo. Apartment
. Esto indica que la clase se puede ejecutar en cualquier subproceso en modo de subproceso único. Si el subproceso que lo crea es un subproceso de STA, el objeto se ejecutará en ese subproceso; de lo contrario, se creará en la STA principal; si no existe una STA principal, se creará un subproceso de STA para él. (Esto significa que los subprocesos de MTA que crean objetos Apartment ordenarán todas las llamadas a un subproceso diferente). La fábrica de clases puede ser llamada simultáneamente por múltiples subprocesos de STA, por lo que debe proteger sus datos internos contra esto.Free
. Esto indica una clase diseñada para ejecutarse en el MTA. Siempre se cargará en el MTA, incluso si lo crea un subproceso de STA, lo que nuevamente significa que se ordenarán las llamadas del subproceso de STA. Esto se debe a que unFree
objeto generalmente se escribe con la expectativa de que pueda bloquearse.Both
. Estas clases son flexibles y se cargan en cualquier apartamento desde el que se creen. Sin embargo, deben escribirse para cumplir con ambos conjuntos de requisitos: deben proteger su estado interno contra llamadas simultáneas, en caso de que estén cargados en el MTA, pero no deben bloquearse, en caso de que estén cargados en una STA.
Desde .NET Framework, básicamente utilícelo [STAThread]
en cualquier subproceso que cree una interfaz de usuario. Los subprocesos de trabajo deben utilizar el MTA, a menos que vayan a utilizar Apartment
componentes COM marcados con -, en cuyo caso utilice el STA para evitar problemas de sobrecarga y escalabilidad si se llama al mismo componente desde varios subprocesos (ya que cada subproceso tendrá que esperar el componente a su vez). Es mucho más fácil si usa un objeto COM separado por subproceso, ya sea que el componente esté en STA o MTA.
Las explicaciones existentes me parecen demasiado tontas. Aquí está mi explicación en inglés sencillo:
STA: si un subproceso crea un objeto COM configurado en STA (al llamar a CoCreateXXX puede pasar un indicador que establece el objeto COM en modo STA), entonces solo este subproceso puede acceder a este objeto COM (eso es lo que significa STA: apartamento de un solo subproceso). ), otro hilo que intenta llamar a métodos en este objeto COM se convierte silenciosamente en la entrega de mensajes al hilo que crea (posee) el objeto COM. Esto se parece mucho al hecho de que sólo el hilo que creó un control de UI puede acceder a él directamente. Y este mecanismo está destinado a evitar operaciones complicadas de bloqueo/desbloqueo.
MTA: si un subproceso crea un objeto COM configurado en MTA, entonces prácticamente todos los subprocesos pueden llamar directamente a métodos en él.
Esa es más o menos la esencia del asunto. Aunque técnicamente hay algunos detalles que no mencioné, como en el párrafo 'STA', el hilo del creador debe ser STA. Pero esto es prácticamente todo lo que necesitas saber para entender STA/MTA/NA.