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

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

J’essaie d’appeler le XAML qui est créé en utilisant WPF . Mais cela me donne une erreur:

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

Je ne sais pas quoi faire. J’essaie de faire ça:

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList(); 

Mais ça me donne cette erreur.

J’ai ajouté un travailleur de base:

 static BackgroundWorker bw = new BackgroundWorker(); static void Main(ssortingng[] 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... } 

Essayez d’invoquer votre code à partir du répartiteur :

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

Si vous effectuez l’appel à partir du thread principal, vous devez append l’atsortingbut STAThread à la méthode Main, comme indiqué dans la réponse précédente.

Si vous utilisez un thread séparé, il doit être 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 thread vous-même, comme ceci:

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

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

Je soupçonne que vous obtenez un rappel à un composant d’interface utilisateur à partir d’un thread d’arrière-plan. Je vous recommande de faire cet appel en utilisant un BackgroundWorker car il s’agit de thread d’interface utilisateur.

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

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

Application.Current.Dispatcher.Invoke (délégué (Action) {// mettre le code ici});

Pour moi, cette erreur s’est produite en raison d’un paramètre nul transmis. Vérifier les valeurs des variables a corrigé mon problème sans avoir à changer le code. J’ai utilisé BackgroundWorker.

Si vous appelez une nouvelle instruction d’interface utilisateur de fenêtre dans un thread existant, une erreur est générée. Au lieu de cela, créez un nouveau thread à l’intérieur du thread principal et écrivez l’instruction d’interface utilisateur de la fenêtre dans le nouveau thread enfant.