218 votes

Le thread appelant doit être STA, car de nombreux composants de l'interface utilisateur requièrent cette opération.

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 ce qu'il faut faire. J'essaie de faire ça :

FacebookApplication.FacebookFriendsList ffl = new FacebookFriendsList();

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

298voto

Amjad Abdelrahman Points 142

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

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

2 votes

Oui, vous avez sauvé ma vie !

21 votes

C'est le réel réponse. Vous pouvez vous attaquer à la stupidité des fenêtres de WPF avec ceci.

9 votes

De la même manière, si vous utilisez MVVMLight, vous pouvez utiliser DispatcherHelper.CheckBeginInvokeOnUI(Action action)

155voto

Timores Points 9916

Si vous effectuez l'appel à 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 séparé, il doit être dans un STA (appartement à un seul thread), ce qui n'est pas le cas des 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();

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

2 votes

Est-ce que cela (l'utilisation de STA) peut avoir des effets secondaires ?

12 votes

Le principal effet secondaire d'être STA est que les callbacks COM simultanés sont sérialisés. Si vous n'utilisez pas de callbacks COM, cela ne devrait pas avoir d'importance.

0 votes

Il m'a sauvé la vie ! J'ai pu l'utiliser dans une application WPF qui hébergeait une API locale pour une intégration entre deux applications différentes !

21voto

Preet Sangha Points 39414

Je soupçonne que vous recevez un appel vers un composant de l'interface utilisateur à partir d'un thread d'arrière-plan. Je vous recommande d'effectuer cet appel à l'aide d'un BackgroundWorker, car il tient compte des threads de l'interface utilisateur.

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

3 votes

J'ai essayé de l'ajouter, comme ci-dessus, mais cela me donne toujours l'erreur :/

1 votes

Je ne suis pas familier avec le code. Pouvez-vous déboguer et trouver exactement la ligne de code qui cause ce problème ?

2voto

Ryan Loggerythm Points 96

Dans mon cas, cette erreur s'est produite parce qu'un paramètre nul a été transmis. La vérification des valeurs des variables a permis de résoudre mon problème sans avoir à modifier le code. J'ai utilisé BackgroundWorker.

-1voto

Balvant Ramani Points 1

Si vous appelez une déclaration UI de nouvelle fenêtre dans un thread existant, une erreur se produit. Au lieu de cela, créez un nouveau thread à l'intérieur du thread principal et écrivez la déclaration de l'interface utilisateur de la fenêtre dans le nouveau thread enfant.

0 votes

Comment écrire, s'il vous plaît expliquer ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X