web-dev-qa-db-fra.com

Appartements à un seul fil vs appartements à plusieurs threads

Duplicata possible:
Pourriez-vous expliquer STA et MTA?

Tous les threads ThreadPool sont dans l'appartement multithread.

- Selon le MSDN

Qu'est-ce que ça veut dire? Je suis vraiment préoccupé par la différence entre le modèle d'appartement multi vs un thread unique. Ou que signifie le modèle d'appartement? J'ai lu le MSDN dessus, et cela n'a pas vraiment de sens pour moi. Je pense que j'ai peut-être une idée, mais je pensais que quelqu'un ici pourrait l'expliquer en anglais simple.

Merci, Anthony D

Mise à jour 1

Trouvé ceci Pourriez-vous expliquer STA et MTA?

Quelqu'un peut-il être plus descriptif?

Mise à jour 2

Je cherche également une réponse sur la façon dont cela s'applique au pool de threads et sur ce que je dois surveiller à cause de cela.

39
Anthony D

STA (appartement à un seul thread) et MTA (appartement à plusieurs threads) sont liés à COM . Les composants COM peuvent être conçus pour être accessibles par un seul thread, auquel cas ils sont hébergés dans un STA , ou ils peuvent être sécurisés en thread interne, et hébergé dans un MTA . Un processus ne peut avoir qu'un seul MTA, mais plusieurs STA. Si vous ne souhaitez consommer que des composants COM, tout ce que vous devez vraiment savoir, c'est que vous devez faire correspondre l'appartement au composant ou des choses désagréables se produiront.

54
Stu Mackellar

En réalité, les STA et les MTA ont un impact sur le code .NET. Voir l'entrée de blog de Chris Brumme pour plus de détails, alors vous avez probablement besoin de:

https://devblogs.Microsoft.com/cbrumme/apartments-and-pumping-in-the-clr/

Il est vraiment important de comprendre comment les STA pompent les messages dans .NET. Cela a des conséquences.

12
Tim

Si votre objet COM doit croire qu'il se trouve dans un environnement à thread unique, utilisez STA. Vous avez la garantie que la création et tous les appels seront effectués par le même thread. Vous pouvez utiliser en toute sécurité le stockage local Thread et vous n'avez pas besoin d'utiliser des sections critiques.

Si votre objet COM est accessible par plusieurs threads simultanément, utilisez MTA - il n'y aura pas de protecteurs mis en place.

9
Lou Franco

Comme d'autres l'ont souligné, cela a généralement peu d'impact sur les applications .NET.

Cependant, sachez que l'hôte de test Microsoft utilisé pour les tests unitaires est en fait implémenté dans une STA, ce qui signifie qu'il y a des limites à ce que vous pouvez faire dans le test unitaire. Par exemple, vous ne pouvez pas faire un WaitAll sur un WaitHandle dans un test unitaire si vous utilisez l'hôte de test de Microsoft.

5
Brian Rasmussen

Vous n'avez pas à vous en préoccuper sauf si vous faites COM-interop, auquel cas il y a des problèmes de marshaling. Il n'a aucune ramification pour .net lui-même.

2
Robert C. Barth