Je suis en train d'apprendre C# 3.5 et je veux savoir ce que [STAThread]
fait dans nos programmes ?
Une idée de la raison pour laquelle CompactFramework ne supporte pas [STAThread]
?
Je suis en train d'apprendre C# 3.5 et je veux savoir ce que [STAThread]
fait dans nos programmes ?
El STAThreadAttribute
est essentiellement une exigence de la pompe à messages Windows pour communiquer avec les composants COM. Bien que le noyau de Windows Forms n'utilise pas COM, de nombreux composants du système d'exploitation, tels que les boîtes de dialogue du système, utilisent cette technologie.
MSDN explique la raison de manière un peu plus détaillée :
L'attribut STAThreadAttribute indique que le modèle de threading COM pour l'application application est monofilaire appartement. Cet attribut doit être présent au point d'entrée de toute application qui utilise 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 application utilise le modèle multithreaded modèle d'appartement, qui n'est pas pris en charge pour Windows Forms.
Cet article de blog ( Pourquoi STAThread est-il nécessaire ? ) explique également très bien cette exigence. Si vous souhaitez obtenir une vue plus approfondie de la manière dont le modèle de threading fonctionne au niveau du CLR, consultez le document suivant cet article de MSDN Magazine de juin 2004 (Archivé, avril 2009).
stackoverflow.com/questions/4154429/apartmentstate-for-dummies cette réponse est assez compréhensible pour des mortels comme moi. Ajouté juste pour référence ici
Il indique au compilateur que vous êtes dans un modèle d'appartement à fil unique. Il s'agit d'un élément COM maléfique, généralement utilisé pour les formulaires Windows (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 le Gui à partir d'un autre thread (si vous avez fait du codage de formulaires).
En gros, ne vous inquiétez pas, acceptez simplement que les threads de l'interface graphique de Windows doivent être marqués comme STA, sinon des choses bizarres se produisent.
STAThread n'a rien à voir avec l'obligation d'invoquer le thread principal lors de l'accès à l'interface graphique. Cela est simplement dû à la nature de la pompe à messages de Windows, et ne peut être évité de manière plus générale dans les applications multithread.
En réalité, il s'agit uniquement de traiter les composants COM tels que les boîtes de dialogue du système d'exploitation et les composants tiers.
Win32 ne porte aucun concept de threading d'appartements, c'est COM qui introduit le concept. COM "re-tâche" ce qui était un système entièrement agnostique (la pompe à messages de Windows) comme un moyen de synchroniser/sérialiser l'exécution du code dans les appartements COM.
L'attribut STAThreadAttribute marque un thread pour utiliser la fonction Single-Threaded COM si COM est nécessaire. Par défaut, .NET n'initialise pas COM du tout. pas du tout. C'est seulement lorsque COM est nécessaire, comme lorsqu'un objet COM ou un contrôle COM est créé ou lorsque le glisser-déposer est nécessaire, que COM est initialisé. Lorsque Lorsque cela se produit, .NET appelle la fonction sous-jacente CoInitializeEx, qui prend un drapeau indiquant si de joindre le thread à un processus multithreading ou monofilaire.
Plus d'informations aquí (Archivé, juin 2009)
y
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.