2010-02-24 2 views
109

Ich bin mit http://www.codeproject.com/KB/IP/Facebook_API.aspxDer aufrufende Thread STA sein muss, weil viele UI-Komponenten benötigen diese

Ich versuche, die XAML zu nennen, die WPF erstellt wird. Aber es gibt mir einen Fehler:

The calling thread must be STA, because many UI components require this.

Ich weiß nicht, was zu tun ist. Ich versuche, dies zu tun:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

Aber es gibt mir diesen Fehler.

Ich habe einen Hintergrund Arbeiter:

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

Antwort

15

Ich vermute, dass Sie einen Rückruf zu einer UI-Komponente aus einem Hintergrundthread bekommen. 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.

+0

Ich habe versucht, es hinzuzufügen, wie oben, aber es gibt immer noch den Fehler:/ –

+0

Ich bin nicht mit dem Code vertraut. Können Sie durchlesen und herausfinden, welche Codezeile das verursacht? –

121

Wenn Sie den Aufruf vom 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 wie folgt selbst erstellen:

mit ThreadProc ist ein Delegat vom Typ ThreadStart.

+2

kann dies (mit STA) möglich Nebeneffekt haben? –

+9

Der Hauptnebeneffekt von STA ist, dass gleichzeitige COM-Rückrufe serialisiert werden. Wenn Sie keine COM-Rückrufe verwenden, sollte das keine Rolle spielen. – Timores

-2

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

+0

wie schreibt man pls erklären? –

0

Dieser Fehler trat bei mir auf, 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.

Application.Current.Dispatcher.Invoke((Action)delegate{ 

//your code 

}); 
119

Versuchen Sie den Code aus dem dispatcher aufzurufen });

+0

Yeahhh, ihr habt mir das Leben gerettet !! –

+6

Dies ist die * echte * Antwort. Sie können WPF's Fenster-Dummheit damit hacken. – Andrew

+5

Und ähnlich, wenn Sie MVVMLight verwenden, können Sie 'DispatcherHelper.CheckBeginInvokeOnUI (Aktion Aktion)' – TimothyP

4

Sie können auch versuchen, diese

// 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(); 
+0

Ein neuer Thread ist nicht erforderlich, rufen Sie einfach den UI-Thread auf. – rolls

3

Application.Current.Dispatcher.Invoke ((Action) delegieren {// setzen-Code hier:

+0

Dies ist das gleiche wie diese Antwort: https://stackoverflow.com/a/21539361/732673 –

Verwandte Themen