Cosa fa [STAThread]?


293

Sto imparando C # 3.5 e voglio sapere cosa [STAThread]fanno i nostri programmi?

Risposte:


240

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).


1
qualche idea del perché CompactFramework non supporta [STAThread]?
bvdb,

1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies questa risposta è abbastanza comprensibile per i mortali come me. Aggiunto solo come riferimento qui
Barış Akkurt,

41

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.


2
STAThread non ha nulla a che fare con il requisito di invocare il thread principale quando si accede alla GUI. Ciò è semplicemente dovuto alla natura del pump dei messaggi di Windows e non può essere evitato più in generale nelle applicazioni multithread.
Noldorin,

3
In realtà, si tratta solo di gestire componenti COM come finestre di dialogo del sistema operativo e componenti di terze parti.
Noldorin,

3
Win32 non porta alcun concetto di threading apartments, la sua COM che introduce il concetto. COM "riordina" quello che era un sistema agnostico interamente thread (il pump dei messaggi di Windows) come mezzo per sincronizzare / serializzare l'esecuzione del codice negli appartamenti COM.
AnthonyWJones,

1
Accettate semplicemente che i gui windows gui devono essere contrassegnati come STA, altrimenti accadono cose strane. :))))))
Nipuna

1
@Noldorin "requisito per invocare il thread principale" - questo non è tecnicamente un requisito . Eccezioni cross-thread non si verificano al di fuori del debugger. Rif: stackoverflow.com/questions/3972727/… . Non dire che non dovresti risolvere questo problema!
Shiv,

31

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

Perché è richiesto STAThread?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.