Risposte:
Il STAThreadAttribute
è essenzialmente un requisito per la pompa di messaggi di Windows per comunicare con i componenti COM. Sebbene Windows Forms di base non utilizzi COM, molti componenti del sistema operativo come le finestre di dialogo di sistema utilizzano questa tecnologia.
MSDN spiega il motivo in modo leggermente più dettagliato:
STAThreadAttribute indica che il modello di threading COM per l'applicazione è un appartamento a thread singolo. Questo attributo deve essere presente nel punto di ingresso di qualsiasi applicazione che utilizza Windows Form; se viene omesso, i componenti di Windows potrebbero non funzionare correttamente. Se l'attributo non è presente, l'applicazione utilizza il modello di appartamento multithread, che non è supportato per Windows Form.
Questo post sul blog ( Perché è necessario STAThread? ) Spiega abbastanza bene il requisito. Se si desidera una visione più approfondita del funzionamento del modello di threading a livello CLR, consultare questo articolo della rivista MSDN del giugno 2004 (archiviato, aprile 2009).
Indica al compilatore che sei in un modello Appartamento a thread singolo. Questa è una cosa COM malvagia, di solito viene utilizzata per Windows Form (GUI) in quanto utilizza Win32 per il suo disegno, che è implementato come STA. Se stai usando qualcosa che è il modello STA da più thread, otterrai oggetti corrotti.
Questo è il motivo per cui devi invocare la Gui da un altro thread (se hai eseguito la codifica dei moduli).
Fondamentalmente non preoccuparti, accetta solo che i thread della GUI di Windows debbano essere contrassegnati come STA, altrimenti accadono cose strane.
STAThreadAttribute contrassegna un thread per utilizzare l'app COM a thread singolo se è necessario COM. Per impostazione predefinita, .NET non inizializza affatto COM. È solo quando COM è necessario, come quando viene creato un oggetto COM o COM Control o quando è necessario trascinare 'n' drop, che COM viene inizializzato. Quando ciò accade, .NET chiama la funzione CoInitializeEx sottostante, che accetta un flag che indica se unire il thread a un appartamento multi-thread o single-thread.
Maggiori informazioni qui (Archiviato, giugno 2009)
e
[STAThread]
?