2009-09-01 7 views

Répondre

199

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).

+1

toute idée pourquoi CompactFramework ne supporte pas '[STAThread]'? – bvdb

20

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.

+1

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

+3

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

+3

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

27

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

Why is STAThread required?