¿Por qué usaría & # 8220; Ambos & # 8221; Modelo de subprocesamiento COM en lugar de & # 8220; Gratis & # 8221 ;?

StackOverflow https://stackoverflow.com/questions/1824397

Pregunta

Según este artículo si registro mi objeto COM con cualquiera de los dos " Ambos " o "Gratis" Enhebrar el modelo de ese objeto debe ser completamente seguro para subprocesos. Específicamente, todos los accesos a las variables globales compartidas deben estar sincronizados y todos los accesos a las variables miembro también deben estar sincronizados. Eso es mucho esfuerzo.

Ahora entiendo que poder registrar mi objeto usando '' Gratis '' El modelo de subprocesos es ventajoso y puede valer la pena pagar el precio de hacerlo completamente seguro. Pero, ¿por qué querría hacer lo mismo y registrar mi objeto usando " Ambos " modelo de roscado en su lugar? ¿Cuál sería la ventaja? ¿Cómo elijo entre " Ambos " y " Gratis " ;?

¿Fue útil?

Solución

Ambos modelos de subprocesos

El motivo principal para marcar su componente como modelo de subprocesos de soporte " Ambos " es para mejorar el rendimiento cuando el componente se llama desde un apartamento de subprocesos individuales (STA).

Si marca su componente como MTA y su componente se crea desde una STA, su componente se creará en un departamento de MTA separado y el " la clasificación resultante entre departamentos podría degradar el rendimiento lo suficiente como para negar todo el trabajo realizado para hacer un componente eficiente y libre de rosca " . Sin embargo, si el modelo de subprocesos de su componente está marcado como " Ambos " luego se creará dentro del departamento del objeto STA y se accederá directamente.

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

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

Modelo de subprocesos libres

Es posible que desee utilizar un " Gratis " modelo de subproceso si su componente utiliza otros componentes que están marcados como " Gratis " ;. Si su componente se marcó como " Ambos " entonces podría haber un cambio excesivo de apartamentos entre los "Ambos" componente 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 apartamento) 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 mensajes STA.

Otras consideraciones y escenarios

Si planea usar el componente en IIS, entonces hay otras cosas a considerar. Para IIS, " Ambos " es la configuración recomendada. Principalmente para evitar problemas de bloqueo con componentes de subprocesos de apartamento, acceso performant a COM + ObjectContext y el hecho de que " Gratis " los componentes roscados utilizan el contexto de seguridad del sistema (si necesita acceso al contexto de seguridad del usuario). Consulte Selección de un modelo de subprocesos para componentes en IIS para obtener más información sobre IIS consideraciones de subprocesamiento.

Otras cosas a considerar son el soporte COM + y cómo se comportan sus componentes si se ejecutan en COM + y si los punteros de interfaz se pasan y almacenan.

Un excelente artículo es Arquitectura de subprocesos y aplicaciones COM en aplicaciones COM + . Tiene un enfoque COM + pero también analiza COM. Para su pregunta, lea la sección titulada "Recomendaciones de modelos de subprocesos". Microsoft ha eliminado el artículo original, así que estoy vinculando a una copia.

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