Pregunta

¿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é?

¿Fue útil?

Solución

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.

Otros consejos

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 departamento es un lugar para que vivan 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 procese 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, configurando el ThreadingModel valor para 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 un Free El 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 redactarse para ajustarse a ambos conjuntos de requisitos:deben proteger su estado interno contra llamadas concurrentes, en caso de que estén cargadas en el MTA, pero no deben bloquear, en caso de que estén cargadas en una STA.

Desde .NET Framework, básicamente solo usa [STAThread] en cualquier hilo que cree UI.Los subprocesos de trabajo deben usar el MTA, a menos que vayan a usar Apartment-componentes COM marcados, en cuyo caso utilice STA para evitar problemas de sobrecarga y escalabilidad si se llama al mismo componente desde varios subprocesos (ya que cada subproceso tendrá que esperar al componente por turno).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:

ESTA: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 subproceso único), otro hilo que intenta llamar a métodos en este objeto COM se convierte silenciosamente en entregar 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 hilo crea un objeto COM configurado en MTA, entonces prácticamente todos los hilos 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.

STA (Single Threaded Apartment) es básicamente el concepto de que solo un hilo interactuará con su código a la vez.Las llamadas a su apartamento se organizan a través de mensajes de Windows (usando una ventana no visible).Esto permite que las llamadas se pongan en cola y esperen a que se completen las operaciones.

MTA (Multi Threaded Apartment) es donde muchos subprocesos pueden operar al mismo tiempo y la responsabilidad de manejar la seguridad del subproceso recae en usted, como desarrollador.

Hay mucho más que aprender sobre los modelos de subprocesos en COM, pero si tiene problemas para comprender qué son, entonces le diría que comprender qué es STA y cómo funciona sería el mejor punto de partida porque la mayoría de los objetos COM son STA.

Subprocesos de apartamento, si un subproceso vive en el mismo apartamento que el objeto que está utilizando, entonces es un subproceso de apartamento.Creo que esto es sólo un concepto COM porque es sólo una forma de hablar sobre los objetos y los hilos con los que interactúan...

Cada EXE que aloja controles COM u OLE define su estado de apartamento.El estado del apartamento es STA por defecto (y para la mayoría de los programas debería ser STA).

STA - Todos los controles OLE por necesidad deben vivir en una STA.STA significa que su objeto COM siempre debe manipularse en el subproceso de la interfaz de usuario y no puede pasarse a otros subprocesos (al igual que cualquier elemento de la interfaz de usuario en MFC).Sin embargo, su programa aún puede tener muchos subprocesos.

MTA - Puedes manipular el objeto COM en cualquier hilo de tu programa.

Según tengo entendido, el 'Apartamento' se utiliza para proteger los objetos COM de problemas de subprocesos múltiples.

Si un objeto COM no es seguro para subprocesos, debe declararlo como un objeto STA.Entonces sólo el hilo que lo crea podrá acceder a él.El hilo de creación debe declararse como un hilo de STA.Debajo del capó, el subproceso almacena la información de STA en su TLS (almacenamiento local de subprocesos).A este comportamiento lo llamamos cuando el hilo ingresa a un apartamento de STA.Cuando otros subprocesos quieran acceder a este objeto COM, debe ordenar el acceso al subproceso de creación.Básicamente, el hilo de creación utiliza un mecanismo de mensajes para procesar las llamadas entrantes.

Si un objeto COM es seguro para subprocesos, debe declararlo como un objeto MTA.Se puede acceder al objeto MTA mediante subprocesos múltiples.

El código que llama a archivos DLL de objetos COM (por ejemplo, para leer archivos de datos propietarios) puede funcionar bien en una interfaz de usuario, pero se cuelga misteriosamente de un servicio.La razón es que a partir de .Net 2.0, las interfaces de usuario asumen STA (seguridad para subprocesos), mientras que los servicios asumen MTA ((antes de eso, los servicios asumían STA).Tener que crear un subproceso STA para cada llamada COM en un servicio puede agregar una sobrecarga significativa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top