2010-11-16 12 views

risposta

15

Un thread che crea qualsiasi finestra deve sempre creare un apartment a thread singolo. Uno STA fornisce garanzie di threading per qualsiasi oggetto COM che non sia thread-safe. Pochissimi sono. L'infrastruttura COM garantisce che i metodi di tale oggetto vengano sempre richiamati dal thread corretto, effettuando il marshalling della chiamata se necessario. Piuttosto simile a Control.Begin/Invoke() ma fatto automaticamente senza alcuna codifica.

Un numero di servizi Windows si basa su tale garanzia. In particolare gli Appunti, Drag + Drop e le finestre di dialogo della shell (come OpenFileDialog) non funzioneranno correttamente senza di essa. E molti controlli ActiveX, WebBrowser è uno di quelli che userai in un progetto Winforms. Rendere il thread dell'interfaccia utente un thread MTA causa una diagnosi difficile, mentre il deadlock è comune. O una rapida eccezione quando il wrapper .NET per il componente verifica che sia stato creato su uno STA.

6

Non è possibile utilizzare MTA in WinForm poiché la maggior parte dei controlli di Windows non funzionerà poiché non sono compatibili con MTA. Quindi usa sempre MTA a meno che il codice della tua applicazione non effettui chiamate agli oggetti COM STA. Ad esempio in ASP.NET, MTA è il modello predefinito.