Threading managé et non managé
Les composants COM utilisent des « apartments » (cloisonnés) pour synchroniser l'accès aux ressources. En revanche, les objets managés utilisent des régions synchronisées, des primitives de synchronisation telles que les mutex, des verrous et des ports de terminaison, ainsi que des contextes synchronisés pour obtenir que toutes les ressources partagées soient utilisées sous une forme thread-safe. Pour plus d'informations sur le modèle de thread .NET, consultez Threading managé.
Pour les besoins de l'interopérabilité, le Common Language Runtime crée et initialise un « apartment » lorsqu'il appelle un objet COM. Un thread managé peut créer et entrer un single-threaded apartment (STA) contenant un seul thread, ou un multi-threaded apartment (MTA) qui contient un ou plusieurs threads. Lorsqu'un « apartment » COM et un « apartment » généré par un thread sont compatibles, COM permet au thread appelant d'adresser des appels directement à l'objet COM. Si les « apartments » sont incompatibles, COM crée un « apartment » compatible et marshale les appels via un proxy dans le nouvel « apartment ».
L'exécution appelle CoInitializeEx pour initialiser le cloisonnement COM comme un MTA ou un thread cloisonné. Dans le .NET Framework version 2.0, les threads managés sont initialisés comme MTA si leur état de cloisonnement n'a pas été défini avant de démarrer le thread. Utilisez la méthode SetApartmentState ou TrySetApartmentState pour définir l'état de cloisonnement avant de démarrer le thread.
Dans le .NET Framework version 2.0, le thread d'application principal est initialisé comme MTA à moins que le STAThreadAttribute soit appliqué à la procédure de point d'entrée.
Remarque |
---|
Dans les versions 1.0 et 1.1 de .NET Framework, il était possible de définir l'état de cloisonnement après l'exécution du thread à l'aide de la System.Threading.ApartmentState ; cela créait une condition de concurrence critique.Dans le .NET Framework version 2.0, cela n'est pas autorisé. |
Certains modèles de programmation nécessitent que vous définissiez la propriété STA sur un thread. Par exemple, pour que Windows Forms initialise des éléments tels que le glisser-déplacer, vous devez créer et entrer un thread cloisonné (STA).
Remarque |
---|
Si ni le proxy/stub ni la bibliothèque de types ne sont inscrits, une InvalidCastException peut se produire lors de l'appel d'un objet COM à partir du code managé. |
Le tableau suivant répertorie les valeurs d'énumération ApartmentState et montre l'appel d'initialisation comparable de l'« apartment » COM.
Valeur d'énumération ApartmentState |
Initialisation de l'« apartment » COM |
---|---|
MTA |
CoInitializeEx(NULL, COINIT_MULTITHREADED) |
STA |
CoIntializeEx(NULL, COINIT_APARTMENTTHREADED) |
Inconnu |
CoInitializeEx(NULL, COINIT_MULTITHREADED) |
Chaque fois que l'objet COM et le thread managé se trouvent dans des « apartments » incompatibles, tous les appels à l'objet sont effectués par l'intermédiaire d'un proxy créé par COM.
Voir aussi
Concepts
Exposition de composants COM au .NET Framework
Exposition de composants .NET Framework à COM