Réponses:
Il STAThreadAttribute
s'agit essentiellement d'une exigence pour que la pompe de messages Windows communique avec les composants COM. Bien que le noyau 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 un peu plus en détail:
STAThreadAttribute indique que le modèle de thread COM pour l'application est cloisonné à un seul thread. Cet attribut doit être présent sur le point d'entrée de toute application qui utilise Windows Forms; s'il est omis, les composants Windows peuvent 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 l'exigence. Si vous souhaitez une vue plus approfondie de la façon dont le modèle de thread fonctionne au niveau CLR, consultez cet article MSDN Magazine de juin 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 les Windows Forms (GUI) car il 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 invoquer sur le Gui depuis un autre thread (si vous avez fait du codage de formulaires).
Fondamentalement, ne vous inquiétez pas, acceptez simplement que les threads de l'interface graphique Windows doivent être marqués comme STA, sinon des choses étranges se produisent.
Le STAThreadAttribute marque un thread pour utiliser l'appartement COM à un seul thread si COM est nécessaire. Par défaut, .NET n'initialise pas COM du tout. Ce n'est que lorsque COM est nécessaire, comme lorsqu'un objet COM ou un contrôle COM est créé ou lorsqu'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 s'il faut joindre le thread à un appartement multithread ou à thread unique.
Pour en savoir plus, cliquez ici (Archivé, juin 2009)
et
[STAThread]
?