J'apprends le C# 3.5 et je veux savoir ce que fait [STAThread]
dans nos programmes?Que fait [STAThread]?
Répondre
Le STAThreadAttribute
est essentiellement requis pour que la pompe de messages Windows communique avec les composants COM. Bien que Windows Forms n'utilise pas COM, de nombreux composants du système d'exploitation tels que les boîtes de dialogue système utilisent cette technologie.
MSDN explique la raison dans un peu plus en détail:
STAThreadAttribute indique que le modèle de thread COM pour l'application est seul thread . Cet attribut doit être présent sur le point d'entrée de toute application utilisant Windows Forms; s'il est omis, les composants Windows risquent de ne pas fonctionner correctement. Si l'attribut n'est pas présent, l'application utilise le modèle d'appartement multithread, qui n'est pas pris en charge par pour Windows Forms.
This blog post (Pourquoi est-STAThread nécessaire?) Explique aussi bien l'exigence. Si vous souhaitez obtenir une vue plus détaillée de la façon dont le modèle de thread fonctionne au niveau CLR, voir this MSDN Magazine article from June 2004 (Archivé, avril 2009).
Il indique au compilateur que vous êtes dans un modèle Single Thread Apartment. C'est une mauvaise chose COM, il est généralement utilisé pour Windows Forms (GUI) car il utilise Win32 pour son dessin, qui est implémenté en tant que STA. Si vous utilisez un modèle STA provenant de plusieurs threads, vous obtenez des objets corrompus.
C'est pourquoi vous devez invoquer sur le Gui à partir d'un autre thread (si vous avez effectué un codage de formulaires).
Fondamentalement ne vous inquiétez pas à ce sujet, il suffit d'accepter que les threads de l'interface graphique Windows doivent être marqués comme STA sinon des trucs bizarres se produisent.
STAThread n'a rien à voir avec l'exigence d'invoquer le thread principal lors de l'accès à l'interface graphique.Ceci est simplement dû à la nature de la pompe de messages Windows, et ne peut pas être évité plus généralement dans les applications multithread. – Noldorin
Vraiment, il s'agit uniquement de gérer les composants COM tels que les boîtes de dialogue de système d'exploitation et les composants tiers. – Noldorin
Win32 ne porte aucun concept d'enfilage d'appartements, son COM qui introduit le concept. COM "re-tâches" ce qui était un système agnostique entièrement thread (la pompe de messages Windows) comme un moyen de synchroniser/sérialiser l'exécution de code dans les appartements COM. – AnthonyWJones
Le STAThreadAttribute marque un fil utiliser le monothread COM Appartement si COM est nécessaire. Par par défaut, .NET n'initialise pas COM à tous. C'est seulement quand COM est nécessaire, comme quand un objet COM ou COM Control est créé ou quand drag 'n' drop est nécessaire, que COM est initialisé. Lorsque se produit, .NET appelle la fonction sous-jacente CoInitializeEx, qui prend un indicateur indiquant si pour joindre le thread à un multithread ou appartement monothread.
En savoir plus Information here (Archivé, Juin 2009)
et
- 1. Que fait cette fonction?
- 2. IIS7 - que fait MaxProcesses?
- 3. Que fait l'opérateur =>?
- 4. Que fait readlink systemcall?
- 5. Que fait exactement FillMode?
- 6. Que fait '@_' dans Perl?
- 7. Que fait exactement rangeOfCharacterFromSet?
- 8. Que fait ce javascript
- 9. Que fait sizeof (char *)?
- 10. Que fait stdole.dll?
- 11. WPF avec Windows Forms - STAThread
- 12. Utilisation de WPF (qui nécessite STAThread) avec une API qui ne peut pas fonctionner avec STAThread
- 13. Que fait (int ** array;) créer?
- 14. WCF: Que fait exactement IsInitiating?
- 15. Que fait la méthode registerNatives()?
- 16. Que fait cet attribut .NET?
- 17. Que fait typedef en C++?
- 18. Que fait ce code Javascript?
- 19. que fait cette macro C++?
- 20. Que fait l'inscription d'une DLL?
- 21. Que fait === faire en PHP
- 22. Que fait l'objet * foo (bar)?
- 23. Que fait ce code javascript?
- 24. Que fait {variable} dans flex
- 25. Que fait <() dans Bash?
- 26. Que fait la méthode Container.validate()?
- 27. Que fait cette expression régulière?
- 28. Que fait ce code? (2)
- 29. Que fait "%% DatabaseEx" dans TSQL?
- 30. Que fait exactement l'utilitaire "ar"?
toute idée pourquoi CompactFramework ne supporte pas '[STAThread]'? – bvdb