3. Cosa succede se si rimuove questo attributo?
Ho solo aggiunto un semplice esempio che dimostra il problema.
Ho creato una semplice app WinForms con un pulsante e un OpenFileDialog. Al clic del pulsante eseguo una discussione che mostra openFileDialog. Lancio l'app con e senza STAThread ei risultati di fare clic sul pulsante sono gli stessi: genera l'eccezione "Operazione cross-thread non valida: controllo 'Form1' a cui si accede da un thread diverso dal thread su cui è stato creato". Sembra che non ci siano differenze. Ma no.
Poi ho cambiato mostra l'OpenFileDialog chiamando il metodo seguito:
private void ShowOFD()
{
if (InvokeRequired)
{
BeginInvoke(new Action(ShowOFD));
return;
}
openFileDialog1.ShowDialog(this);
}
Con STAThread funziona bene come previsto. Senza STAThread lancia l'eccezione: "Il thread corrente deve essere impostato sulla modalità STA (Single Thread Apartment) prima che sia possibile effettuare chiamate OLE. Assicurarsi che la funzione Main abbia contrassegnato STAThreadAttribute. Questa eccezione viene sollevata solo se è collegato un debugger al processo ".
Quindi avvio l'app più volte senza debugger (disconnesso da Visual Studio). Una volta l'app si chiudeva silenziosamente, un'altra volta l'app si chiudeva con il messaggio "vshost ha smesso di funzionare"
Possibile duplicato: http://stackoverflow.com/questions/102437/why-do-all-winforms-programs-require-the-stathread-attribute –
@Cody: Sì, scusa, non l'ho visto, ma IMHO questa risposta è molto meglio dell'altra. –
Sì, è giusto. Non ho votato per chiudere perché quelle risposte non erano fantastiche. Il più importante bit di conoscenza da trarre da questa domanda è questo link: http://blogs.msdn.com/b/jfoscoding/archive/2005/04/07/406341.aspx –