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

Antworten:

222

Versuchen Sie, Ihren Code vom Dispatcher aus aufzurufen :

Application.Current.Dispatcher.Invoke((Action)delegate{
      // your code
});
Amjad Abdelrahman
quelle
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.

Timores
quelle
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();  
Atik Sarker
quelle
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.

Preet Sangha
quelle
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 :)

LiRoN
quelle
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.

Ryan Loggerythm
quelle
-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.

Balvant Ramani
quelle
wie schreibe ich pls erklären?
Tushar Gupta - Curioustushar