2009-08-18 4 views

risposta

32

Questo è più un requisito di Windows che uno di WPF e torna alla progettazione originale di moduli e controlli di Windows, da prima di .NET.

STAThread fa riferimento a "Appartamenti a filettatura singola" che fa riferimento al modello di filettatura utilizzato dalla filettatura corrente (principale). Il modello di threading in uso determina in che modo altre applicazioni .NET e COM parleranno con l'applicazione (e intrinsecamente i suoi thread). Il modello di applicazione a thread singolo richiede che nessun singolo oggetto "viva in" più di un thread STA alla volta, contro il modello di thread MTA; e consente il passaggio dei puntatori ai dati attraverso gli appartamenti solo tramite marshalling-as-object.

Fondamentalmente, con la dichiarazione [STAThread], altre applicazioni sapranno quale politica del thread è quando si inviano i dati. Il modello STA è il modello di threading più comune per thread/applicazioni Windows; ma a volte ti imbatti in un determinato codice che non verrà eseguito se chiamato da un thread modellato STA, poiché è progettato per inviare/ricevere dati oltre i limiti dei thread in modi che non sono conformi alle restrizioni STA. Sapendo in anticipo che cosa il modello di appartamento di un determinato thread consente all'IDE di intercettare queste eccezioni in fase di compilazione invece di commettere errori di violazione dell'accesso quando si tenta di utilizzare un oggetto oltre i limiti del thread durante il runtime.

Si può leggere su STA e thread MTA dal l'articolo di MSDN a: http://msdn.microsoft.com/en-us/library/ms680112(VS.85).aspx

Nota che anche normali applicazioni .NET (da prima di WPF) hanno richiesto la dichiarazione [STAThread] cima del main().

4

C'è una risposta eccellente per questo in questo blog entry.

Citando dal blog:

Quando lo STAThreadAttribute è applicata, cambia lo stato appartamento del thread corrente sia thread singolo. Senza entrare in un'enorme discussione sul threading COM e , questo attributo garantisce il meccanismo di comunicazione tra il thread corrente e altri thread che potrebbe voler parlare ad esso tramite COM. Quando si utilizza Windows Form, a seconda di sulla funzionalità che si sta utilizzando, potrebbe essere utilizzando l'interoperabilità COM per comunicare con i componenti del sistema operativo . Buoni esempi di questo sono gli Appunti e le finestre di dialogo dei file.

Windows Form non è supportato all'interno di di un MTA o di un appartamento con thread libero. Le applicazioni che utilizzano Windows Form devono sempre dichiarare lo stile dell'appartamento che utilizzano, poiché alcuni altri componenti potrebbero inizializzare lo stato del thread dell'appartamento in modo errato.

+0

se non è "troppo complicato" per un principiante .. quindi non è necessario ..mi piace leggere :) –

+2

È ancora bello avere un riepilogo qui su SO per scopi di riferimento, e se il suddetto blog va offline, il post viene eliminato, Microsoft brucia in una palla di hellfire, ecc. –

Problemi correlati