2011-02-03 253 views
1

我试图创建一个使用另一个线程一些用户控件(S)和我使用这样的代码:创建WPF用户控件

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

但我得到这个例外在用户控件的构造函数:

The calling thread must be STA, because many UI components require this. 

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

谢谢。

回答

3

控件的创建可以在任何线程上完成,但将它们添加到GUI需要同步到主线程。

在这种情况下,只有3个控件,忘记任务,直接做,单线程。

+0

实际上有100个控件,因此我正在寻找多线程 – 2011-02-03 10:25:22

+0

@Robin:运气不好,重要的东西必须在主线程上完成。您可以使用任务来准备控件列表,确保它们不需要Handle。 – 2011-02-03 10:28:44

+0

谢谢,我试过这个,但是,例外仍然存在!实际上从其他线程调用构造函数是导致异常的原因,而不是将控件添加到窗口。 – 2011-02-03 10:42:09

1

您可以使用Dispatcher调度添加控件的操作给孩子收集到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); 
     })); 
    } 
    }); 
} 

通过调用BeginInvoke的分派器上,你基本上添加操作要在UI线程上执行的队列。