谁能解释一下,如何在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/