2010-09-01 7 views
2

Quelqu'un peut-il m'expliquer, comment puis-je créer WPF Window dans le thread BackgroundWorker sans erreurs?Comment créer une fenêtre WPF dans BackgroundWorker?

J'ai une classe (WPF fenêtre):

public partial class Captcha : Window 
    { 
     public Captcha() 
     { 
      InitializeComponent(); 
     } 

     private void SendCaptchaBtn_Click(object sender, RoutedEventArgs e) 
     { 
      DialogResult = true; 
      this.Close(); 
     } 
    } 

En DoWork fonction de BackgroundWorker J'essaie de créer un objet avec cette fenêtre:

BackgroundWorker bgWorker = new BackgroundWorker(); 
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); 
bgWorker.RunWorkerAsync(); 

void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
       parser = new Parser(); 
       parser.ParseFunc(tempKeywords); 
     } 

L'objet Parser a un "Captcha" fenêtre:

Captcha captcha_dlg = new Captcha(); 

Quand je lance le programme, j'ai erreur d'exécution à constuctor de poi Captcha classe nt: Le thread appelant doit être STA, car de nombreux composants UI l'exigent. Qu'est-ce qui ne va pas? Thansk pour aider et désolé pour mon mauvais anglais :(.

Répondre

4

La réponse courte est, vous ne pouvez pas.

Les fils utilisés par BackgroundWorker sont threads MTA, car ils viennent de la piscine de fil. Il n'y a pas façon de changer un fil de MTA à STA après son démarrage.

Si vous voulez créer l'interface utilisateur sur un autre fil, votre meilleur pari est d'utiliser la classe Thread, et le mettre à STA avant le démarrage en appelant SetApartmentState().

+0

Merci, maintenant ça marche :). C'est la solution optimale - pour chaque asynch. fonction/processus dans mon programme pour créer un autre thread? Et qu'en est-il du Dispatcher? Il aime MethodInvoker et les délégués dans Windows Form Applications et peut-être besoin, par exemple, pour accéder à certains contrôles dans la fenêtre principale? :) – Dmitriy

+0

@Dmitriy Si vous demandez s'il est optimal de créer un nouveau thread pour chaque chose asynchrone que fait votre programme, je ne vois pas d'autre moyen si vous voulez montrer l'interface utilisateur sur ce thread, car WPF doit fonctionner sur un Fil STA. – Andy

+0

Avoir deux fenêtres sur le même thread n'est pas vraiment un gros problème, car le gros travail se fait habituellement de manière asynchrone (sur un autre thread) – JoshVarga

Questions connexes