Der aufrufende Thread muss STA sein, da dies für viele UI-Komponenten erforderlich ist


174

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

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

Der aufrufende Thread muss STA sein, da dies für viele UI-Komponenten erforderlich ist.

Ich weiß nicht was ich tun 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...
}

Antworten:


222

Versuchen Sie, Ihren Code vom Dispatcher aus aufzurufen :

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

Yeahhh, ihr habt mir das Leben gerettet !!
Alex McManns

11
Das ist die wahre Antwort. Damit können Sie sich von WPFs Fensterdummheit abkoppeln.
Andrew

7
Und ähnlich, wenn Sie zufällig MVVMLight verwenden, können Sie verwendenDispatcherHelper.CheckBeginInvokeOnUI(Action action)
TimothyP

Dieses Problem schien kompliziert und frustriert, aber diese Aufnahme ist wirklich cool! Ich danke dir sehr !
Kay Lee

4
@ Andrew Es ist keine Dummheit, Sie versuchen einfach, von einem Hintergrund-Thread auf den UI-Thread zuzugreifen.
Krusty

139

Wenn Sie den Aufruf vom Hauptthread aus ausführen, müssen Sie das Attribut STAThread zur Hauptmethode hinzufügen, wie in der vorherigen Antwort angegeben.

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

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

t.Start();

wobei ThreadProc ein Delegat vom Typ ThreadStart ist.


2
Kann dies (mit STA) möglicherweise Nebenwirkungen haben?
Louis Rhys

10
Der Hauptnebeneffekt von STA ist, dass simultane COM-Rückrufe serialisiert werden. Wenn Sie keine COM-Rückrufe verwenden, sollte dies keine Rolle spielen.
Timores

Rettete mein Leben! Konnte dies in einer WPF-App verwenden, die eine lokale API für eine Integration zwischen zwei verschiedenen Apps hostete!
schizoid04

18

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

Vielen Dank. Dies ist hilfreich, wenn Sie die Applicationcontext-Klasse anstelle von Form verwenden.
SaddamBinSyed

Ich öffne ein neues Formular, wenn auf eine Schaltfläche geklickt wird, wie ich es an zahlreichen anderen Stellen tue. Irgendeine Idee, warum nur einer dieser Orte diesen Fehler auslöst?
Paul McCarthy

17

Ich vermute, dass Sie von einem Hintergrundthread einen Rückruf zu einer UI-Komponente erhalten. Ich empfehle, diesen Aufruf mit einem BackgroundWorker zu tätigen, da dies dem UI-Thread bekannt ist.

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


1
Ich habe versucht, es wie oben hinzuzufügen, aber es gibt mir immer noch den Fehler: /
C ..

Ich bin mit dem Code nicht vertraut. Können Sie die Codezeile, die dies verursacht, genau untersuchen und herausfinden?
Preet Sangha

3

Markieren Sie einfach Ihr Programm mit dem [STAThread]Attribut und der Fehler verschwindet! es ist Magie :)


1

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


-3

Wenn Sie eine neue Fenster-UI-Anweisung in einem vorhandenen Thread aufrufen, wird ein Fehler ausgegeben. Erstellen Sie stattdessen einen neuen Thread im Hauptthread und schreiben Sie die Fenster-UI-Anweisung in den neuen untergeordneten Thread.


wie schreibe ich pls erklären?
Tushar Gupta - Curioustushar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.