如何将在另一个线程中创建的WPF UIElement添加到在主线程中创建的Grid?

时间:2014-07-12 03:39:34

标签: c# wpf multithreading datagrid

我有一个WPF项目,我需要将我的繁重进程发送到另一个线程然后获取结果并将其发送到主线程。昂贵的操作是从数据库中检索数据并使用数据填充数据网格,然后将其发送到主线程以添加到网格中。我创建了一个线程,实例化并运行它:

Thread thread = new Thread(new ThreadStart(myHeavyProcess));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

这是我的方法:

private void myHeavyProcess()
    {
        DataGrid datagrd = new DataGrid();
        //....
        //populate the datagrid with data 
        //...

        grdCharts.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)(() => grdCharts.Children.Add(datagrd )));
    }

grdCharts 在主线程中创建, datagrd 在新线程中创建,在我尝试使用Dispatcher将datagrd添加到grdcharts的最后一行中,因为它来自一个不同的线程。

问题是,由于grdCharts位于主线程和新线程中的datagrd,我如何将datagrd添加到grdCharts?或者一般情况下我们如何将一个UIElement从一个线程复制到另一个?

注意:我需要在另一个线程中填充datagrid,因为这是我讨论的昂贵过程。

1 个答案:

答案 0 :(得分:2)

理想情况下,UI元素不应该在后台线程中创建

要解决此问题,您可以在后台线程中准备数据,然后在UI线程中创建datagrid并分配准备好的数据。

例如

    private void myHeavyProcess()
    {
        ObservableCollection<object> data = new ObservableCollection<object>();
        //....
        //prepare data 
        //...

        grdCharts.Dispatcher.BeginInvoke(
            (Action<IEnumerable>)(d => grdCharts.Children.Add(new DataGrid() { ItemsSource = d })), 
            DispatcherPriority.Background, 
            new object[] { data });
    }