如何在BackgroundWorker中创建WPF窗口?

时间:2010-09-01 18:44:58

标签: wpf backgroundworker

任何人都可以解释一下,如何在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函数中,我试图用这个Window创建一个对象:

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

Parser对象有一个“Captcha”窗口:

Captcha captcha_dlg = new Captcha();

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

1 个答案:

答案 0 :(得分:4)

简短的回答是,你不能。

BackgroundWorker使用的任何线程都是MTA线程,因为它们来自线程池。启动后无法将线程从MTA更改为STA。

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