Que fait [STAThread]?

293

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

odiseh
la source

Réponses:

240

Il STAThreadAttributes'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).

Noldorin
la source
1
une idée pourquoi CompactFramework ne prend pas en charge [STAThread]?
bvdb
1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies cette réponse est assez compréhensible pour les mortels comme moi. Ajouté juste pour référence ici
Barış Akkurt
41

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.

Spence
la source
2
STAThread n'a rien à voir avec l'exigence d'invoquer le thread principal lors de l'accès à l'interface graphique. Cela 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
En réalité, il s'agit uniquement de traiter des composants COM tels que les boîtes de dialogue du système d'exploitation et les composants tiers.
Noldorin
3
Win32 ne comporte aucun concept de threading appartements, son COM qui introduit le concept. COM "retravaille" ce qui était un système entièrement indépendant des threads (la pompe de messages Windows) comme moyen de synchroniser / sérialiser l'exécution du code dans les appartements COM.
AnthonyWJones
1
Acceptez simplement que les fenêtres gui doivent être marquées comme STA, sinon des choses étranges se produisent. :))))))
Nipuna
1
@Noldorin "exigence d'invoquer le thread principal" - ce n'est pas techniquement une exigence . Les exceptions entre threads ne se produisent pas en dehors du débogueur. Réf: stackoverflow.com/questions/3972727/… . Mais ne dites pas que vous ne devez pas résoudre ce problème!
Shiv
31

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

Pourquoi STAThread est-il requis?

rahul
la source