Sto imparando C# 3.5 e voglio sapere che cosa fa [STAThread]
nei nostri programmi?Cosa fa [STAThread]?
risposta
Il STAThreadAttribute
è essenzialmente un requisito per il pump dei messaggi di Windows per comunicare con i componenti COM. Sebbene Windows Form di base non utilizzi la COM, molti componenti del sistema operativo come le finestre di dialogo del sistema utilizzano questa tecnologia.
MSDN spiega il motivo in un po 'più in dettaglio:
STAThreadAttribute indica che il modello di threading COM per l'applicazione è single-threaded appartamento. 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 apartment multithread , che non è supportato da per Windows Form.
This blog post (Perché STAThread richiesto?) spiega anche il requisito abbastanza bene. Se si desidera una vista più approfondita su come funziona il modello di threading al livello CLR, vedere this MSDN Magazine article from June 2004 (Archiviato, aprile 2009).
Indica al compilatore di essere in un modello di apartment a thread singolo. Questa è una cosa COM male, di solito viene utilizzata per Windows Form (GUI) in quanto utilizza Win32 per il suo disegno, che viene implementato come STA. Se si utilizza qualcosa che è il modello STA da più thread, si ottengono oggetti corrotti.
Questo è il motivo per cui è necessario invocare il Gui da un altro thread (se è stata eseguita una codifica di moduli).
Fondamentalmente non preoccuparti, accetta solo che i thread della GUI di Windows devono essere contrassegnati come STA, altrimenti accadono cose strane.
STAThread non ha nulla a che fare con il requisito di richiamare il thread principale quando si accede alla GUI.Ciò è semplicemente dovuto alla natura della pompa dei messaggi di Windows e non può essere evitato più generalmente nelle applicazioni multithread. – Noldorin
In realtà, si tratta solo di gestire componenti COM come finestre di dialogo del SO e componenti di terze parti. – Noldorin
Win32 non ha alcun concetto di threading apartments, la sua COM che introduce il concetto. COM "ri-attività" che cosa era un sistema agnostico interamente thread (la pompa di messaggio di Windows) come un mezzo per sincronizzare/serializzare l'esecuzione di codice in appartamenti COM. – AnthonyWJones
Lo STAThreadAttribute segna un filo di utilizzare il single-threaded COM appartamento se è necessaria COM. Per impostazione predefinita , .NET non inizializzerà COM a tutti. È solo quando è necessario COM, come quando viene creato un oggetto COM o Controllo COM o quando è necessario trascinare la selezione è necessario, che COM viene inizializzata. Quando si verifica , .NET chiama la funzione CoInitializeEx sottostante, che accetta un flag che indica se unire la discussione a un apartment multithreaded o a thread singolo.
Per maggiori informazioni here (archiviato, giugno 2009)
e
idea del perché CompactFramework non supporta '[STAThread]'? – bvdb