Il thread chiamante deve essere STA, poiché molti componenti dell’interfaccia utente richiedono questo

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

Sto cercando di chiamare lo XAML che viene creato usando WPF . Ma mi dà un errore:

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

Io non so cosa fare. Sto cercando di 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... } 

Prova a richiamare il codice dal dispatcher :

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

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, deve trovarsi in uno STA (apartment a thread singolo), che non è il caso dei thread di background worker. Devi creare il thread da te, in questo modo:

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

con ThreadProc che è un delegato di tipo ThreadStart.

Ho il sospetto che stai ricevendo un callback a un componente dell’interfaccia utente da un thread in background. Mi raccomando di effettuare quella chiamata usando un BackgroundWorker dato che questa è una conoscenza dell’interfaccia utente.

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

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(); 

Application.Current.Dispatcher.Invoke ((Action) delegate {// put Code here});

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.

Se si chiama una nuova istruzione dell’interfaccia utente in una discussione 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 secondario.