2009-12-01 6 views
11

De acuerdo con this article si registro mi objeto COM con el modelo de subprocesamiento "Ambos" o "Gratis", ese objeto debe ser completamente seguro para subprocesos. Específicamente, todos los accesos a las variables compartidas globales deben estar sincronizados y todos los accesos a las variables miembro también deben estar sincronizados. Eso es mucho esfuerzo.¿Por qué usaría el modelo de conexión COM "Ambos" en lugar de "Gratis"?

Ahora entiendo que la posibilidad de registrar mi objeto como un modelo de subprocesamiento "gratuito" es ventajoso y podría valer la pena pagar el precio de hacerlo completamente seguro para subprocesos. Pero ¿por qué querría hacer todo lo mismo y registrar mi objeto utilizando el modelo de subprocesamiento "Ambos"? ¿Cuál sería la ventaja? ¿Cómo elijo entre "Ambos" y "Gratis"?

Respuesta

20

Tanto Modelo de subprocesos

La razón principal para marcar el componente como apoyo modelo de subprocesos "Ambos" es para mejoras en el rendimiento cuando el componente se está llamando desde un único subproceso (STA).

Si marca su componente como MTA y su componente se crea dentro de una STA, entonces su componente se creará en un apartamento separado de MTA y "resultant inter-apartment marshaling might degrade performance enough to negate all the work put into making an efficient, free-threaded component". Sin embargo, si el modelo de subprocesamiento de su componente está marcado como "Ambos", se creará dentro del apartamento del objeto STA y se accederá directamente.

Entonces, si cree que su componente puede ser llamado desde dentro de una STA (todos los objetos COM de VB6 son STA) es posible que desee marcar el modelo de subprocesamiento como "Ambos".

Un buen artículo de KB en OLE Threading Models.

libre Modelo de subprocesos

Es posible que desee utilizar un modelo de hilo "libre" si su componente utiliza otros componentes que están marcados como "libre". Si su componente se marcó como "Ambos", podría haber una conmutación de departamento excesiva entre el componente "Ambos" que se ejecuta en el STA y el MTA. Como regla general, intente crear el componente lo más cerca posible de la persona que llama (es decir, el mismo departamento) mientras funciona correctamente en todos los escenarios.

Otra situación que justificaría marcar su componente como "Gratis" es si bloquea explícitamente (por ejemplo, Thread.Sleep). Si el componente está marcado como "Ambos" e instanciado en una STA, entonces el componente bloquearía la bomba de mensaje STA.

Otras consideraciones y escenarios

Si usted está planeando sobre el uso del componente en IIS, a continuación, hay otras cosas a considerar. Para IIS, "Ambos" es la configuración recomendada. Principalmente para evitar problemas de bloqueo con componentes roscados de Apartamento, acceso performante a COM + ObjectContext y el hecho de que los componentes roscados "Libres" usan el contexto de seguridad del sistema (si requiere acceso al contexto de seguridad del usuario). Consulte Selecting a Threading Model for Components in IIS para obtener más información sobre las consideraciones de subprocesamiento de IIS.

Otros aspectos a tener en cuenta son la compatibilidad con COM + y cómo se comportan sus componentes si se ejecutan en COM + y si se pasan y almacenan los punteros de la interfaz.

Un excelente artículo es COM Threading and Application Architecture in COM+ Applications. Tiene un enfoque COM + pero también discute COM. Para su pregunta, lea la sección titulada "Recomendaciones del modelo de subprocesos". Microsoft ha eliminado el artículo original, así que estoy vinculando a una copia.

+2

Esa es una gran explicación, excepto que ahora no entiendo por qué marcaría que mi objeto es "Gratis" y no "Ambos" ya que se ve como "Ambos" es más ventajoso. – sharptooth

+1

Porque es posible que desee "forzarlo" en el MTA, es decir, muchos otros objetos en el MTA accederán a él y no quiere que estos usen proxies para la STA en la que su objeto es creado (por un consumidor de VB6) – wqw

+0

Bueno, si hay dos hilos, uno STA y un MTA y ambos llaman CoCreateInstance() entonces ... Si un objeto está marcado como "Ambos", se crea una copia en STA y otra en MTA. Las llamadas de Thread1 a STA y de Thread2 a MTA son directas, otras pasan por proxies. Si el objeto está marcado como "Gratis", ambas copias están en un MTA y solo las llamadas de Thread1 a MTA pasan por el proxy, otras son directas. Eso es genial, pero ¿por qué el objeto impone este último y no deja que sea un problema de los clientes? – sharptooth

Cuestiones relacionadas