Question

J'ai un composant COM hérité et ma mission est d'écrire un service Web qui encapsule le COM et permet des appels simultanés sans blocage.

Tout d'abord, parce que l'objet COM lui-même est sans état, j'ai décidé d'utiliser l'attribut [ThreadStatic] afin que chaque thread ait sa propre instance de l'objet COM pour empêcher l'utilisation de l'instruction lock {} et permettre un traitement simultané réel. , mais il semble que tous les appels ont toujours lieu de manière synchrone.

J'ai écrit un code de test qui exécute une méthode à partir du composant COM de manière synchrone avec la boucle {}, puis j'ai ajouté un deuxième thread qui faisait exactement la même chose mais dans une autre instance de l'objet COM. Je n'ai vu aucun changement, X appelle consommez toujours Y fois, peu importe le nombre de threads. C'est comme s'il y avait un verrou statique ou quelque chose comme ça ...

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

Que puis-je faire pour activer les appels simultanés réels vers le composant COM?

Était-ce utile?

La solution

COM est conscient des threads et respectera le modèle de thread demandé par le coclass. Il publie ses exigences de thread avec la valeur ThreadingModel dans le registre. Si ce paramètre est défini sur "Appartement" (ou est manquant), COM s'assurera que tous les appels de méthode sont effectués à partir d'un seul appartement threadé en renvoyant un proxy pour les interfaces que vous avez QI. Le proxy veille à ce que l'appel soit dirigé vers le bon thread.

Vous pouvez tricher et utiliser le pointeur d'interface que vous avez obtenu lors de la création de la coclasse dans un thread STA et effectuer des appels sans marshaling. Étant donné que la coclasse a déjà indiqué qu'elle n'est pas capable de fonctionner en multi-threading, il est très peu probable que cela fonctionne correctement. Vous allez juste corrompre l'état interne de manière aléatoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top