2010-09-01 109 views
2

任何人都可以解释我,我怎么能在BackgroundWorker线程中创建WPF窗口没有错误?如何在BackgroundWorker中创建WPF窗口?

我有一些类(WPF窗口):

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

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

在BackgroundWorker的的DoWork的功能我试图创建与此窗口中的对象:

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

解析器对象有一个 “验证码” Window:

Captcha captcha_dlg = new Captcha(); 

当我运行程序时,在Captcha-class poi的构造函数中有运行时错误nt:调用线程必须是STA,因为许多UI组件都需要这个。 怎么了? Thansk帮助和抱歉,我的英语不好:(。

回答

4

简短的回答是,你不能。

通过BackgroundWorker使用的任何线程是MTA线程,因为他们来自线程池,没有办法是启动后从MTA线程切换到STA。

如果你想在另一个线程创建UI,最好的办法是通过调用SetApartmentState()使用Thread类,并启动前将其设置为STA。

+0

谢谢,现在它工作:)。这是最佳解决方案 - 针对每个异步。函数/进程在我的程序中创建另一个线程? 那么Dispatcher呢?它就像MethodInvoker和Windows窗体应用程序中的代表一样,例如可能需要访问主窗口中的一些控件? :) – Dmitriy 2010-09-01 19:14:27

+0

@Dmitriy如果你问是否最适合为程序正在执行的每个异步事件创建一个新线程,如果你想在该线程上显示UI,我不会看到另一种方式,因为WPF必须运行在STA线程。 – Andy 2010-09-01 19:41:39

+0

在同一个线程上有两个窗口并不是一个大问题,因为繁重的工作通常是异步完成的(在另一个线程上) – JoshVarga 2010-09-01 21:41:58