Der aufrufende Thread muss STA sein, da viele UI-Komponenten dies erfordern

Ich verwende http://www.codeproject.com/KB/IP/Facebook_API.aspx

Ich versuche, das XAML aufzurufen, das mit WPF erstellt wird . Aber es gibt mir einen Fehler:

Der aufrufende Thread muss STA sein, da viele UI-Komponenten dies erfordern.

Ich weiß nicht, was ich machen soll. Ich versuche das zu tun:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

Aber es gibt mir diesen Fehler.

Ich habe einen Hintergrundarbeiter hinzugefügt:

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

Versuchen Sie, Ihren Code vom Dispatcher aus aufzurufen:

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

Wenn Sie den Aufruf aus dem Hauptthread ausführen, müssen Sie das STAThread-Attribut der Main-Methode hinzufügen, wie in der vorherigen Antwort angegeben.

Wenn Sie einen separaten Thread verwenden, muss er sich in einer STA (Single-Threaded Apartment) befinden, was für Hintergrund-Worker-Threads nicht der Fall ist. Sie müssen den Thread selbst erstellen, so:

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

wobei ThreadProc ein Delegat vom Typ ThreadStart ist.

Ich vermute, dass Sie von einem Hintergrundthread einen callback zu einer UI-Komponente erhalten. Ich empfehle, dass Sie diesen Aufruf mit einem BackgroundWorker durchführen, da dies für die Benutzeroberfläche geeignet ist.

Für den BackgroundWorker sollte das Hauptprogramm als [STAThread] markiert sein.

Sie können dies auch versuchen

 // 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 {// Code hier eingeben});

Bei mir ist dieser Fehler aufgetreten, weil ein Nullparameter übergeben wurde. Durch das Überprüfen der Variablenwerte wurde mein Problem behoben, ohne dass der Code geändert werden musste. Ich habe BackgroundWorker benutzt.

Wenn Sie in einem vorhandenen Thread eine UI-statement für ein neues Fenster aufrufen, wird ein Fehler ausgegeben. Erstellen Sie stattdessen einen neuen Thread innerhalb des Hauptthreads, und schreiben Sie die UI-statement des Fensters in den neuen untergeordneten Thread.