web-dev-qa-db-fra.com

Que fait [STAThread]?

J'apprends le C # 3.5 et je veux savoir ce que [STAThread] fait dans nos programmes?

273
odiseh

La STAThreadAttribute est essentiellement une condition requise pour que la pompe de messages Windows puisse communiquer avec les composants COM. Bien que les principaux Windows Forms n'utilisent 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 un peu plus en détail:

STAThreadAttribute indique que le modèle de thread COM pour l'application est un appartement mono-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 pour Windows Forms.

Cet article de blog ( Pourquoi STAThread est-il requis? ) explique également très bien cette exigence. Si vous souhaitez obtenir une vue plus détaillée du fonctionnement du modèle de thread au niveau CLR, voir cet article de MSDN Magazine de juin 2004 (archivé, avril 2009).

230
Noldorin

Il indique au compilateur que vous vous trouvez dans un modèle à un seul thread. C’est un truc COM diabolique, il est généralement utilisé pour Windows Forms (GUI), qui utilise Win32 pour son dessin, qui est implémenté en tant que STA. Si vous utilisez quelque chose qui est un modèle STA à partir de plusieurs threads, vous obtenez des objets corrompus.

C'est pourquoi vous devez appeler sur l'interface graphique à partir d'un autre thread (si vous avez déjà codé des formulaires).

Fondamentalement, ne vous inquiétez pas pour cela, acceptez simplement que les threads de l'interface graphique Windows doivent être marqués comme STA, faute de quoi des choses étranges se produisent.

31
Spence

Le STAThreadAttribute marque un fil pour utiliser l'appartement COM à un seul fil si COM est nécessaire. Par défaut, .NET n'initialisera pas du tout COM. C'est uniquement lorsque COM est nécessaire, comme lorsqu'un objet COM ou un contrôle COM est créé ou qu'un glisser-déposer est nécessaire, que COM est initialisé. Lorsque cela se produit, .NET appelle la fonction CoInitializeEx sous-jacente, qui prend un indicateur indiquant si le thread doit être associé à un appartement multi-thread ou mono-thread.

Lire plus d'infos ici (Archivé, juin 2009)

et

Pourquoi STAThread est-il nécessaire?

29
rahul