2009-08-18 4 views

Répondre

32

Il s'agit plus d'un besoin de Windows que d'un WPF, et revient à la conception d'origine des formulaires et des contrôles Windows, d'avant .NET. STAThread fait référence à "Single-Threaded Apartments" qui se réfère au modèle de filetage utilisé par le filetage (principal) courant. Le modèle de thread utilisé détermine la manière dont les autres applications .NET et COM communiqueront avec votre application (et de manière inhérente, ses threads). Le modèle d'application monothread nécessite qu'aucun objet ne "réside" dans plus d'un thread STA à la fois, par rapport au modèle de thread MTA; et permet le passage de pointeurs vers des données à travers les appartements uniquement via le marshalling-as-object. Fondamentalement, avec la déclaration [STAThread], d'autres applications sauront quelle est la politique de votre thread lors de l'envoi de vos données. Le modèle STA est le modèle de thread le plus courant pour les threads/applications Windows. mais vous rencontrerez parfois du code qui ne fonctionnera pas s'il est appelé à partir d'un thread modélisé STA, car il est conçu pour envoyer/recevoir des données à travers les limites de thread de manière non conforme aux restrictions STA. Connaître au préalable le modèle d'appartement d'un thread donné permet à l'EDI d'intercepter ces exceptions lors de la compilation au lieu d'obtenir des erreurs de violation d'accès désagréables lorsque vous tentez d'utiliser un objet à travers les limites de thread pendant l'exécution.

Vous pouvez lire STA et threads MTA de l'article MSDN à l'adresse: http://msdn.microsoft.com/en-us/library/ms680112(VS.85).aspx

Notez que les applications .NET même normales (avant de WPF) nécessaires la déclaration [STAThread] au-dessus de la main().

4

Il y a une excellente réponse pour cela dans ce blog entry.

Je cite le blog:

Lorsque le STAThreadAttribute est appliquée, il change l'appartement état du thread courant pour être seul thread. Sans entrer dans une discussion énorme sur le filetage COM et , cet attribut assure le mécanisme de communication entre le thread courant et d'autres discussions que voudra peut-être lui parler via COM. Lorsque vous utilisez Windows Forms, en fonction sur la fonctionnalité que vous utilisez, il peut être en utilisant COM Interop afin de communiquer avec les composants du système d'exploitation . De bons exemples de ceci sont le Presse-papiers et les boîtes de dialogue de fichier.

Windows Forms n'est pas pris en charge dans un MTA ou un appartement à filetage libre. Les applications utilisant Windows Forms doivent toujours déclarer le style de l'appartement qu'elles utilisent, car un autre composant peut initialiser incorrectement l'état du thread .

+0

si ce n'est pas "trop ​​compliqué" pour un débutant .. alors vous n'avez pas besoin de ..J'aime lire :) –

+2

Il est toujours agréable d'avoir un résumé ici sur SO à des fins de référence, et si ledit blog se déconnecte, le message est supprimé, Microsoft brûle dans une boule de feu de l'enfer, etc. –

Questions connexes