Il thread chiamante deve essere STA, poiché molti componenti dell'interfaccia utente lo richiedono


174

sto usando http://www.codeproject.com/KB/IP/Facebook_API.aspx

Sto cercando di chiamare l' XAML che viene creato utilizzando WPF . Ma mi dà un errore:

Il thread chiamante deve essere STA, poiché molti componenti dell'interfaccia utente lo richiedono.

Io non so cosa fare. Sto provando a fare questo:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

Ma mi sta dando quell'errore.

Ho aggiunto un lavoratore in background:

static BackgroundWorker bw = new BackgroundWorker();

static void Main(string[] args)
{
    bw.DoWork += bw_DoWork;
    bw.RunWorkerAsync("Message to worker");
    Console.ReadLine();
}

static void bw_DoWork(object sender, DoWorkEventArgs e)
{
    // This is called on the worker thread
    FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

    Console.WriteLine(e.Argument);        // Writes "Message to worker"

    // Perform time-consuming task...
}

Risposte:


223

Prova a invocare il codice dal dispatcher :

Application.Current.Dispatcher.Invoke((Action)delegate{
      // your code
});

Sì, ragazzi, mi avete salvato la vita !!
Alex McManns,

11
Questa è la vera risposta Con questo puoi fare a pezzi la stupidità della finestra di WPF.
Andrew,

7
E simile a questo, se ti capita di usare MVVMLight puoi usareDispatcherHelper.CheckBeginInvokeOnUI(Action action)
TimothyP

Questo problema sembrava complicato e frustrato, ma questo scatto è davvero fantastico! Grazie mille !
Kay Lee,

4
@Andrew Non è stupidità, stai semplicemente cercando di accedere al thread dell'interfaccia utente da un thread in background.
Krusty

139

Se si effettua la chiamata dal thread principale, è necessario aggiungere l'attributo STAThread al metodo Main, come indicato nella risposta precedente.

Se si utilizza un thread separato, è necessario trovarsi in un STA (appartamento a thread singolo), che non è il caso dei thread di lavoro in background. Devi creare tu stesso il thread, in questo modo:

Thread t = new Thread(ThreadProc);
t.SetApartmentState(ApartmentState.STA);

t.Start();

con ThreadProc come delegato di tipo ThreadStart.


2
questo (usando STA) può avere effetti collaterali?
Louis Rhys,

10
Il principale effetto collaterale dell'essere STA è che i callback COM simultanei sono serializzati. Se non si utilizzano i callback COM, non dovrebbe importare.
Timores,

Salvato la mia vita! È stato in grado di utilizzarlo in un'app WPF che ospitava un'API locale per un'integrazione tra due app diverse!
schizoid04,

18

Puoi anche provare questo

// create a thread  
Thread newWindowThread = new Thread(new ThreadStart(() =>  
{  
    // create and show the window
    FaxImageLoad obj = new FaxImageLoad(destination);  
    obj.Show();  

    // start the Dispatcher processing  
    System.Windows.Threading.Dispatcher.Run();  
}));  

// set the apartment state  
newWindowThread.SetApartmentState(ApartmentState.STA);  

// make the thread a background thread  
newWindowThread.IsBackground = true;  

// start the thread  
newWindowThread.Start();  

Grazie. Ciò sarà di aiuto quando si utilizza la classe Applicationcontext anziché Form.
SaddamBinSyed il

Sto aprendo un nuovo modulo quando si fa clic su un pulsante come faccio in molti altri luoghi. Qualche idea sul perché solo uno di quei posti stia lanciando questo errore?
Paul McCarthy,

17

Ho il sospetto che stai ricevendo una richiamata a un componente dell'interfaccia utente da un thread in background. Ti consiglio di effettuare quella chiamata utilizzando un BackgroundWorker in quanto è a conoscenza del thread dell'interfaccia utente.

Per BackgroundWorker, il programma principale deve essere contrassegnato come [STAThread].


1
Ho provato ad aggiungerlo, come sopra, ma mi dà ancora l'errore: /
C ..

Non ho familiarità con il codice. Puoi eseguire il debug e scoprire esattamente la riga di codice che causa questo?
Preet Sangha,

3

Basta contrassegnare il programma con l' [STAThread]attributo e l'errore scompare! è magico :)


1

Per me, questo errore si è verificato a causa del passaggio di un parametro null. Il controllo dei valori delle variabili ha risolto il problema senza dover modificare il codice. Ho usato BackgroundWorker.


-3

Se si chiama una nuova istruzione dell'interfaccia utente della finestra in un thread esistente, viene generato un errore. Invece di creare un nuovo thread all'interno del thread principale e scrivere l'istruzione UI della finestra nel nuovo thread figlio.


come scrivere pls spiegare?
Tushar Gupta - curioustushar,
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.