2011-02-03 278 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線程上執行的隊列。