Qu'est-ce que [STAThread] faire?
-
20-09-2019 - |
Question
J'apprends C # 3.5 et je veux savoir ce que fait [STAThread]
dans nos programmes?
La solution
Le STAThreadAttribute
est essentiellement une exigence pour la pompe de messages Windows pour communiquer avec les composants COM. Bien que les principaux Windows Forms n'utilise pas COM, de nombreux composants du système d'exploitation tels que les boîtes de dialogue de système utilisez cette technologie.
MSDN explique la raison dans un peu plus en détail:
STAThreadAttribute indique que la modèle de thread COM pour la application est mono-thread appartement. Cet attribut doit être présent sur le point d'entrée de tout application qui utilise Windows Forms; si elle est omise, Windows composants pourraient ne pas fonctionner correctement. Si l'attribut est pas présent, le application utilise le multithread modèle appartement, ce qui est pris en charge pour Windows Forms.
Ce blog ( Pourquoi est STAThread nécessaire? ) explique aussi bien l'exigence. Si vous voulez une analyse plus approfondie de vue sur la façon dont le modèle de thread fonctionne au niveau CLR, voir cet article MSDN Magazine de Juin 2004 (Archivé, avril 2009).
Autres conseils
Il indique au compilateur que vous êtes dans un modèle Single Thread Apartment. Ceci est une mauvaise chose COM, il est généralement utilisé pour Windows Forms (GUI) en utilisant Win32 pour son dessin, qui est mis en œuvre comme STA. Si vous utilisez quelque chose qui est le modèle STA de plusieurs threads vous obtenez des objets corrompus.
C'est pourquoi vous devez invoquer sur le fil d'un autre Gui (si vous avez fait toute forme de codage).
En gros ne vous inquiétez pas, juste accepter que les threads Windows GUI doivent être marqués comme substance STA sinon bizarre se passe.
Le STAThreadAttribute marque un fil d'utiliser le monothread COM Appartement si COM est nécessaire. Par par défaut, .NET n'initialiser COM à tout. Il est seulement quand COM est nécessaire, comme quand un objet COM ou COM contrôle est créé goutte ou lorsque glisser « n » est nécessaire que le COM est initialisé. Quand cela se produit, appelle .NET la sous-jacente fonction CoInitializeEx, qui prend un drapeau indiquant si pour rejoindre le fil à un multithread ou appartement monothread.
En savoir plus d'info (Archivé, Juin 2009)
et