在其他线程中创建Wpf用户控件

时间:2011-02-03 10:13:17

标签: c# wpf multithreading .net-4.0

我正在尝试使用另一个线程创建一些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.

我不确定我是否使用正确的方法来做到这一点。拜托,你能帮我解决这个问题。

感谢。

3 个答案:

答案 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线程上执行。