C# 如何在不冻结UI线程的情况下更改DataGrid ItemsSource?

C# 如何在不冻结UI线程的情况下更改DataGrid ItemsSource?,c#,wpf,multithreading,datagrid,C#,Wpf,Multithreading,Datagrid,我有一个客户列表,我更新了我的DataGrid的itemsource以包含客户列表。 问题是,在更改项资源之后,线程会将所有绑定目标更新为每个客户对象中的值,此操作会将UI冻结30秒以上。 为了解决这个问题,我尝试更改另一个线程中的ItemsSource属性,但新线程无法访问UI线程所拥有的datagrid控件。 如果我将itemsource更改代码放入Invoke方法中,UI将再次冻结 //The following code is handled in another thread //

我有一个客户列表,我更新了我的
DataGrid
itemsource
以包含客户列表。
问题是,在更改
项资源之后,线程会将所有绑定目标更新为每个客户对象中的值,此操作会将UI冻结30秒以上。
为了解决这个问题,我尝试更改另一个
线程中的
ItemsSource
属性,但新线程无法访问UI线程所拥有的datagrid控件。
如果我将
itemsource
更改代码放入
Invoke
方法中,UI将再次冻结

//The following code is handled in another thread

// Geting a list of Customers
List<Customer> customers = manager.AllCustomers.SearchCustomers(fName, lName, address, city, tz, phone);

//Changing the DataGrid ItemsSource
Dispatcher.Invoke(() => customersSearchResultsDG.ItemsSource = customers);
//UI Thread is freezing until ItemsSource Changing complete
//以下代码在另一个线程中处理
//获取客户名单
List customers=manager.AllCustomers.SearchCustomers(fName,lName,address,city,tz,phone);
//更改DataGrid项资源
调用(()=>CustomerSearchResultsDG.ItemsSource=customers);
//UI线程处于冻结状态,直到ItemsSource更改完成
p、 s

它认为没有真正困扰我的时间量,因为我创建了一个加载动画控件。。但是冻结会使动画卡住,这正是我试图解决的问题。

当WPF应用程序中的UI线程繁忙时,UI将显示为冻结。对此我们无能为力,但为了避免这种情况,我们通常在后台线程中尽可能多地执行长时间运行的工作。然而,正如您所发现的,您无法从后台线程操作UI元素,因此我们只能做这么多

我们可以做的其他事情是使用虚拟化、容器回收和/或优化使用的
模板
s,以尽量减少UI线程的繁忙时间。您可以从MSDN上的页面了解更多信息


但是,由于集合中的项目数量较少,在我看来,要么您加载和/或准备数据的效率极低,要么您有非常大且复杂的
DataTemplate
s来定义您的项目。如果你的问题是后者,上面提供的链接应该会帮助你。

30秒冻结,因为分配一个已经准备好的收藏对我来说似乎很疯狂。您确定这是分配问题,而不是检索数据本身吗?每个客户有10个属性,列表中有20多个客户。。。要花多少时间?我会再次调试它,并检查是否有其他问题,但我不这么认为。我明白。。。但即使只需要10秒钟,这也将是一个问题。实际上,我并不在乎这个动作是否需要5分钟。。为了解决等待的感觉,我创建了一个加载控件,它工作得很好,但是“UI冻结”也冻结了加载控件,加载动画也被卡住了。这很正常,但至少它确认了所花费的时间是由框架渲染UI,而不是数据加载。要澄清的是,当WPF中的UI线程忙时,UI中的所有控件都将冻结。那么是否有解决此问题的方法?当UI线程忙时,UI将冻结,并且对此无能为力。