Pregunta

Tengo un componente COM heredado, y mi misión es escribir un servicio web que envuelva el COM y permita llamadas simultáneas sin bloqueo.

En primer lugar, debido a que el objeto COM en sí no tiene estado, decidí usar el atributo [ThreadStatic] para que cada subproceso tenga su propia instancia del objeto COM para evitar el uso de la instrucción lock {} y permitir el procesamiento concurrente real , pero parece que todas las llamadas siguen siendo sincrónicas.

Escribí un código de prueba que ejecuta un método desde el componente COM sincrónico con el bucle for {}, y luego agregué un segundo hilo que hace exactamente lo mismo pero a otra instancia del objeto COM, y no vi cambios, X llama siempre consume el intervalo de tiempo Y, sin importar el número de hilos. Es como si hubiera un bloqueo estático o algo así ...

A pesar de eso, procesos separados pueden procesar cada llamada simultáneamente de manera real. ¿Qué impide que los hilos separados se comporten igual?

¿Qué puedo hacer para habilitar llamadas simultáneas reales al componente COM?

¿Fue útil?

Solución

COM es consciente de subprocesos y respetará el modelo de subprocesos solicitado por la coclass. Publica sus requisitos de subprocesos con el valor ThreadingModel en el registro. Si se establece en " Apartamento " (o falta), COM se asegurará de que todas las llamadas a métodos se realicen desde un único apartamento con subprocesos devolviendo un proxy para las interfaces que QI. El proxy garantiza que la llamada se organice en el hilo correcto.

Podrías hacer trampa y usar el puntero de interfaz que obtuviste cuando creaste la coclass en un hilo STA y hacer llamadas sin calcular. Dado que la coclass ya dijo que no es capaz de realizar subprocesos múltiples, es muy poco probable que funcione correctamente. Simplemente corromperá el estado interno al azar.

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