2010-11-16 7 views

Répondre

15

Un thread qui crée des fenêtres doit toujours créer un appartement monothread. Une STA fournit des garanties de thread pour tout objet COM qui n'est pas thread-safe. Très peu sont. L'infrastructure COM garantit que les méthodes d'un tel objet sont toujours appelées depuis le bon thread, en marshaling l'appel si nécessaire. Tout à fait similaire à Control.Begin/Invoke() mais fait automatiquement sans codage.

Un certain nombre d'installations Windows reposent sur cette garantie. Notamment le Presse-papiers, Drag + Drop et les boîtes de dialogue shell (comme OpenFileDialog) ne fonctionneront pas correctement sans elle. Et beaucoup de contrôles ActiveX, WebBrowser étant un commun que vous utiliserez dans un projet Winforms. Faire de votre thread d'interface utilisateur un thread MTA provoque un diagnostic difficile de l'échec, l'impasse étant une commune. Ou une exception rapide lorsque l'encapsuleur .NET pour le composant vérifie deux fois qu'il a été créé sur un STA.

6

Vous ne pouvez pas utiliser MTA dans WinForms car la plupart des contrôles Windows ne fonctionneront pas car ils ne sont pas compatibles avec MTA. Donc, utilisez toujours MTA sauf si le code de votre application appelle les objets COM STA. Par exemple dans ASP.NET, MTA est le modèle par défaut.