wpf - 如何在BackgroundWorker中创建WPF窗口?

标签 wpf backgroundworker

谁能解释一下,如何在BackgroundWorker线程中创建WPF窗口而不出现错误?

我有一些类(class)(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);
        }

解析器对象有一个“Captcha”窗口:

Captcha captcha_dlg = new Captcha();

当我运行程序时,我在验证码类点的构造函数处出现运行时错误:调用线程必须是 STA,因为许多 UI 组件都需要此。 怎么了?感谢您的帮助,并对我的英语不好感到抱歉:(。

最佳答案

简短的回答是,你不能。

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

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

关于wpf - 如何在BackgroundWorker中创建WPF窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3621150/

相关文章:

c# - ReportProgress 不使用 c# 中的任务调用 progressChanged

c# - 在 C# 中通过名称查找后台工作对象

c# - WPF - 通过相对源绑定(bind)为自定义标记扩展提供设计时值(value)

c# - 如何在执行拖放操作时通过控件传递 hotTest

c# - WPF 工具包图表控件 -

android - 如何创建一个自动上传Android图片的应用程序?

c# - 利用 BackGroundWorker 跨线程调用 Winforms 控件上的 GUI 操作?

c# - 读取和处理每个约 100Mb 的大型文本文件

c# - Caliburn Micro WindowManager 设置 WindowStyle.None 并允许拖动

wpf - WPF 什么时候决定重新查询命令是否可以执行?