102 votes

STAThread et multithreading

De l'article MSDN sur STAThread:

Indique que le COM modèle de thread pour une application single-threaded apartment (STA).

(Pour référence, c'est l'ensemble de l'article.)

Single-threaded apartment... OK, qui allaient au-dessus de ma tête. Aussi, j'ai lu quelque part que, à moins que votre application utilise COM interop, cet attribut ne fait rien du tout. Qu'est-ce exactement est-il et comment fonctionne-t-il affecter les applications multithread? Devrait des applications multithread (qui comprend rien de personne à l'aide de Timers asynchrone appels de méthode, pas seulement threadpools), l'utilisation MTAThread, même si c'est "juste pour être sûr"? Ce n'STAThread et MTAThread faire réellement?

59voto

Bruce Points 3473

Appartement threading est une COM concept; si vous n'êtes pas à l'aide de COM, et aucun des Api que vous appelez utiliser COM "sous les couvertures", alors vous n'avez pas à vous soucier des appartements.

Si vous avez besoin d'être conscients des appartements, puis les détails peuvent être un peu compliqué; un probablement simpliste version est que les objets COM tagged as STA doit être exécuté sur un STAThread, et les objets COM marqué MTA doit être exécuté sur un thread MTA. L'utilisation de ces règles, COM pouvez optimiser les appels entre ces différents objets, en évitant de regroupement où il n'est pas nécessaire.

3voto

1800 INFORMATION Points 55907

Ce qui fait qu'il assure CoInitialize est appelé en précisant COINIT_APARTMENTTHREADED en tant que paramètre. Si vous n'utilisez pas de composants COM ou des contrôles ActiveX, il n'aura aucun effet sur vous. Si vous le faites, il est d'une importance cruciale.

Les contrôles qui sont cloisonné sont effectivement mono-thread, les appels vers eux ne peuvent être traitées que dans l'appartement qu'ils ont été créés.

Un peu plus en détail à partir de MSDN:

Les objets créés dans un seul thread appartement (STA) de recevoir des appels de méthode seulement à partir de leur appartement du thread, donc les appels sont sérialisés et arrivent seulement au message de la file d'attente des limites (lorsque le Fonction Win32 PeekMessage ou SendMessage est appelé).

Les objets créés dans un COM thread dans un multithread appartement (MTA) doivent être en mesure de recevoir les appels de méthode d' d'autres fils à tout moment. Vous généralement en œuvre une certaine forme de contrôle de la simultanéité dans un multithread objet du code à l'aide de Win32 des primitives de synchronisation tels que les sections critiques, les sémaphores, ou mutex pour aider à protéger l'objet les données.

Lorsqu'un objet est configuré pour exécuter dans le neutre threaded apartment (NTA) est appelée par un thread qui est en soit un STA ou le MTA, le thread les transferts à la NTA. Si ce fil par la suite des appels CoInitializeEx, l' appel échoue et renvoie RPC_E_CHANGED_MODE.

-15voto

Zeinth Points 5

STAThread est écrit avant la fonction principale d’un projet c# GUI. Il ne fait rien mais permet au programme de création d’un thread unique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X