2009-11-28 4 views
3

J'ai un composant COM hérité et ma mission consiste à écrire un service Web qui encapsule le COM et active les appels non bloquants simultanés. Tout d'abord, comme l'objet COM lui-même est sans état, j'ai décidé d'utiliser l'attribut [ThreadStatic] pour que chaque thread ait sa propre instance de l'objet COM afin d'empêcher l'utilisation de l'instruction lock {} et d'activer le vrai concurrent traitement, mais il semble que tous les appels encore traités synchrone.Utilisation du composant COM hérité dans l'environnement multithread C#

J'ai écrit un code de test qui exécute une méthode du composant COM synchrone avec for {} loop, puis ajouté un deuxième thread qui fait exactement la même chose mais à une autre instance de l'objet COM, et je n'ai vu aucun changement. les appels consomment toujours Y timespan, peu importe le nombre de threads. C'est comme s'il y avait un verrou statique ou quelque chose ...

Malgré cela, des processus séparés peuvent traiter chaque appel simultanément pour de vrai. Qu'est-ce qui empêche les fils séparés de se comporter de la même manière?

Que puis-je faire pour activer les vrais appels simultanés au composant COM?

Répondre

3

COM est threading conscient et honorera le modèle de thread demandé par la coclasse. Il publie ses exigences de thread avec la valeur ThreadingModel dans le Registre. Si elle est définie sur "Appartement" (ou est manquant), COM s'assurera que tous les appels de méthode sont effectués à partir d'un appartement unique à threads en retournant un proxy pour les interfaces vous QI. Le proxy s'assure que l'appel est marshalé au bon thread.

Vous pouvez tricher et utiliser le pointeur d'interface que vous avez obtenu lorsque vous avez créé la coclasse dans un thread STA et passer des appels sans marshaling. Étant donné que le coclass a déjà dit qu'il n'est pas capable de multi-thread, il est très peu probable que cela fonctionne correctement. Vous allez juste corrompre l'état interne.