2010-04-17 4 views
12

J'ai une application WPF dans laquelle un thread vérifie une valeur. Dans certains cas, je montre une fenêtre pop-up Window afin d'afficher un message. Lorsque je crée cette fenêtre pop-up dans le fil, une exception est levée par le constructeur de la fenêtre pop-up:"Le thread appelant doit être STA, car de nombreux composants IU nécessitent cette erreur" lors de la création d'une fenêtre contextuelle WPF dans le thread

« Le thread appelant doit être STA, parce que de nombreux composants de l'interface utilisateur exigent. »

Comment résoudre cette erreur?

Ceci est mon code pour créer la fenêtre pop-up:

// using System.Threading; 
// using System.Windows.Threading; 
Thread Messagethread = new Thread(new ThreadStart(delegate() 
{ 
    DispatcherOperation DispacherOP = 
     frmMassenger.Dispatcher.BeginInvoke(
      DispatcherPriority.Normal, 
      new Action(delegate() 
      { 
       frmMassenger.Show(); 
      })); 
})); 
Messagethread.Start(); 
+1

J'ai trouvé Racine problème. J'ai une minuterie qui, dans chaque timer.tick, vérifie les nouveaux messages, puis affiche chaque nouveau message. Le fil de minuterie rend mon travail si dur. – Rev

+1

Hors sujet: Dans WPF, les fenêtres s'appellent juste cela: "windows"; pas "formes". Ce dernier terme est utilisé dans un autre cadre d'interface utilisateur, Windows Forms. – stakx

+0

@stakx: Merci – Rev

Répondre

9

Absolument Dispatcher est seul moyen de faire quelque chose (dans cette discussion spécifique) lorsque nous travaillons avec le multi-threading dans WPF!

Mais pour le travail avec Dispatcher nous devons savoir 2 choses:

  1. Trop de façon d'utiliser Dispatcher comme Dispatcher_Operation, [window.dispatcher] ou etc.
  2. Nous devons call dispatcher in the main thread of app (ce fil est doit être thread STA)

Ainsi, par exemple: si nous voulons montrer autre fenêtre [WPF] dans un autre thread, nous pouvons utiliser ce code:

Frmexample frmexample = new Frmexample(); 
      Frmexample .Dispatcher.BeginInvoke 
       (System.Windows.Threading.DispatcherPriority.Normal, 
       (Action)(() => 
       { 
        frmexample.Show(); 
        //---or do any thing you want with that form 
       } 
       )); 

Astuce:Remember - we can't access any fields or properties from out dispatcher, so use that wisely

13

Pour votre fil que vous essayez de démarrer l'élément graphique, vous devez définir l'état appartement de votre fil à STA AVANT le vous le démarrez.

Exemple:

myThread.SetApartmentState(ApartmentState.STA); 
myThread.Start(); 
+0

@Rev: Faites-moi savoir, si elle ne dépasse pas votre erreur, faites-moi savoir le message d'erreur et je vais fournir les informations supplémentaires dont vous avez besoin. Je pense que c'est tout ce dont tu auras besoin. –

+0

thx pour l'aide mais cela ne fonctionne pas. ce problème lié à Wpf et Threading. Je pense que nous devrions utiliser Dispatcher pour résoudre ce problème. Cordialement Rev – Rev

+2

@Rev: Vous avez probablement 2 problèmes. Le threading STA et le répartiteur. Si vous voulez de l'aide avec le répartiteur faites le moi savoir et je peux vous montrer comment. –

Questions connexes