我正在尝试使用另一个线程创建一些UserControl,我正在使用这样的代码:
private void btnDemo_Click(object sender, RoutedEventArgs e)
{
Task tsk = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 3; i++)
{
MyControl sprite = new MyControl();
pnlTest.Children.Add(sprite);
}
});
}
但是我在UserControl构造函数中得到了这个异常:
The calling thread must be STA, because many UI components require this.
我不确定我是否使用正确的方法来做到这一点。拜托,你能帮我解决这个问题。
感谢。
答案 0 :(得分:2)
控件的创建可以在任何线程上完成,但是将它们添加到GUI需要与主线程同步。
在这种情况下,只需3个控件,忘记任务,直接执行,单线程。
答案 1 :(得分:2)
答案 2 :(得分:1)
您可以使用Dispatcher:
分派将控件添加到UI集合的操作到UI线程private void btnDemo_Click(object sender, RoutedEventArgs e)
{
Task tsk = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 3; i++)
{
Dispatcher.BeginInvoke(new Action(() => {
MyControl sprite = new MyControl();
pnlTest.Children.Add(sprite);
}));
}
});
}
通过在Dispatcher上调用BeginInvoke,您基本上将操作添加到队列以在UI线程上执行。