Как я могу создать окно WPF в BackgroundWorker? - PullRequest
2 голосов
/ 01 сентября 2010

Может кто-нибудь объяснить мне, как я могу создать окно WPF в потоке BackgroundWorker без ошибок?

У меня есть класс (Окно WPF):

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

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

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

Объект Parser имеет окно "Captcha":

Captcha captcha_dlg = new Captcha();

Когда я запускаю программу, у меня возникает ошибка времени выполнения в конструкторе точки класса Captcha: Вызывающий поток должен быть STA, потому что это требуется для многих компонентов пользовательского интерфейса. В чем дело? Спасибо за помощь и извините за мой плохой английский: (.

1 Ответ

4 голосов
/ 01 сентября 2010

Короткий ответ: вы не можете.

Все потоки, используемые BackgroundWorker, являются потоками MTA, поскольку они происходят из пула потоков. Нет способа изменить поток с MTA на STA после его запуска.

Если вы хотите создать пользовательский интерфейс в другом потоке, лучше всего использовать класс Thread и установить его в STA перед запуском, вызвав SetApartmentState () .

...