Pourquoi utiliser les & # 8220; les deux & # 8221; Modèle de threading COM au lieu de & # 8220; Gratuit & # 8221 ;?

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

Question

Selon cet article si j'enregistre mon objet COM avec l'un ou l'autre " Les deux " ou " Gratuit " modèle de thread cet objet doit être complètement thread-safe. Plus précisément, tous les accès aux variables partagées globales doivent être synchronisés et tous les accès aux variables membres doivent également être synchronisés. C'est beaucoup d'effort.

Je comprends maintenant que je peux enregistrer mon objet en utilisant "Free". Le modèle à fileter est avantageux et vaut peut-être la peine de payer le prix pour le rendre totalement thread-safe. Mais pourquoi voudrais-je faire tout de même et enregistrer mon objet en utilisant "Les deux"? modèle de filetage à la place? Quel serait l'avantage? Comment choisir entre "Les deux"? et "gratuit"?

Était-ce utile?

La solution

Modèle de threading

La raison principale pour marquer votre composant en tant que modèle de filetage prenant en charge " Les deux " vise à améliorer les performances lorsque le composant est appelé à partir d'un appartement à thread unique (STA).

Si vous marquez votre composant en tant que MTA et que votre composant est créé à partir d'une STA, votre composant sera créé dans un appartement MTA distinct et le " Le marshaling résultant entre les appartements risque de dégrader suffisamment les performances pour annuler tout le travail consacré à la création d'un composant efficace et à thread libre ". Toutefois, si le modèle de thread de votre composant est marqué comme "Les deux". il sera ensuite créé à l'intérieur de l'appartement de l'objet STA et accessible directement.

Ainsi, si vous pensez que votre composant peut être appelé depuis un STA (tous les objets COM VB6 sont des STA), vous pouvez marquer le modèle de thread en tant que "Les deux".

Un bon article de la base de connaissances sur les modèles de threading OLE .

Modèle de threading gratuit

Vous pouvez utiliser un " Gratuit " modèle de thread si votre composant utilise d'autres composants marqués comme "Free". Si votre composant était marqué comme "Les deux" il pourrait alors y avoir une commutation excessive d’appartement entre les deux options. composant fonctionnant dans la STA et le MTA. En règle générale, essayez de créer le composant aussi près que possible de l'appelant (même appartement) tout en fonctionnant correctement dans tous les scénarios.

Autre situation qui justifierait de marquer votre composant en tant que " Gratuit " est si elle bloque explicitement (par exemple, Thread.Sleep). Si le composant est marqué comme "Les deux" et instancié dans une STA, le composant bloquerait alors la pompe à messages STA.

Autres considérations et scénarios

Si vous prévoyez d'utiliser le composant dans IIS, vous devez prendre en compte d'autres éléments. Pour IIS, "Les deux". est le réglage recommandé. Principalement pour éviter les problèmes de verrouillage des composants threadés Apartment, un accès performant à COM + ObjectContext et le fait que " Free " Les composants threadés utilisent le contexte de sécurité du système (si vous avez besoin d'accéder au contexte de sécurité de l'utilisateur). Voir Sélection d'un modèle de thread pour les composants dans IIS pour plus d'informations sur IIS. considérations relatives au filetage.

Vous devez également prendre en compte le support COM +, le comportement de vos composants s’ils sont exécutés dans COM +, ainsi que le transfert et le stockage des pointeurs d’interface.

Un excellent article est Threading COM et architecture d'application dans les applications COM + . Il a un focus COM + mais discute également de COM. Pour votre question, lisez la section "Recommandations relatives au modèle de filetage". Microsoft a supprimé l'article d'origine et je crée un lien vers une copie.

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