【问题标题】:How to add WPF UIElement created in another thread to a Grid created in main thread? [duplicate]如何将在另一个线程中创建的 WPF UIElement 添加到在主线程中创建的 Grid 中? [复制]
【发布时间】:2014-07-12 03:39:34
【问题描述】:

我有一个 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 从一个线程复制到另一个?

注意:我需要在另一个线程中填充数据网格,因为这是我所说的昂贵过程。

【问题讨论】:

  • 已关闭。请参阅我在重复问题中的回答,了解如何在多线程场景中正确使用 WPF UI 功能。

标签: c# wpf multithreading datagrid


【解决方案1】:

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

为了克服这个问题,您可以在后台线程中准备数据,然后在 UI 线程中创建数据网格并分配准备好的数据。

例子

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多