web-dev-qa-db-fra.com

Le thread appelant doit être STA, car de nombreux composants d'interface utilisateur en ont besoin.

J'utilise http://www.codeproject.com/KB/IP/Facebook_API.aspx

J'essaie d'appeler le XAML qui est créé avec WPF Mais cela me donne une erreur:

Le thread appelant doit être STA, car de nombreux composants d'interface utilisateur l'exigent.

Je ne sais pas quoi faire. J'essaie de faire ceci:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

Mais cela me donne cette erreur.

J'ai ajouté un travailleur de fond:

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

Essayez d’appeler votre code à partir de dispatcher :

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

Si vous appelez à partir du thread principal, vous devez ajouter l'attribut STAThread à la méthode Main, comme indiqué dans la réponse précédente.

Si vous utilisez un thread distinct, il doit figurer dans un STA (single-threaded apartment), ce qui n'est pas le cas pour les threads de travail en arrière-plan. Vous devez créer le fil vous-même, comme ceci:

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

t.Start();

avec ThreadProc étant un délégué de type ThreadStart.

129
Timores

Je suspecte que vous obteniez un rappel sur un composant d'interface utilisateur à partir d'un thread en arrière-plan. Je vous recommande de passer cet appel en utilisant un BackgroundWorker, car il s'agit d'un thread compatible avec l'interface utilisateur.

Pour BackgroundWorker, le programme principal doit être marqué comme [STAThread].

15
Preet Sangha

Vous pouvez aussi essayer ceci

// 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();  
11
atik sarker

Marquez simplement votre programme avec l'attribut [STAThread] et l'erreur disparaîtra! c'est magique :)

1
liron

Pour moi, cette erreur est due à la transmission d'un paramètre null. Vérifier les valeurs des variables corrigeait mon problème sans avoir à changer le code. J'ai utilisé BackgroundWorker.

0
Ryan Loggerythm