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

时间:2014-11-26 12:42:15

标签: c# wpf multithreading datagrid

我有一个客户列表,我更新了DataGrid的{​​{1}}以包含客户列表。
问题是在更改ItemsSource之后,线程将所有绑定目标更新为每个客户对象中的值,此操作会冻结UI超过30秒。
为了解决这个问题,我尝试更改另一个ItemsSource中的ItemsSource属性,但新线程无法访问UI线程拥有的数据网格控件。
如果我将Thread更改代码放在ItemsSource方法中,则UI将再次冻结。

Invoke

P.S
它认为没有真正打扰我的时间因为我创建了一个加载动画控件..但是冻结让动画卡住了,这就是我想要解决的问题。

1 个答案:

答案 0 :(得分:1)

当WPF应用程序中的UI线程忙时,UI将显示为冻结。没有什么可以做的,但为了避免这种情况,我们通常在后台线程中尽可能多地进行长时间的工作。但是,正如您所发现的那样,您无法从后台线程中操纵UI元素,因此我们可以做很多事情。

我们可以采取的其他措施是尽量减少UI线程繁忙的时间,使用虚拟化,容器回收,freezing resources和/或优化使用过的Template。您可以在MSDN上的Optimizing Performance: Controls页面上找到有关此内容的更多信息。

但是,由于您的收藏中的项目数量很少,我认为您加载和/或准备数据的效率非常低,或者您有非常大且复杂的DataTemplate来定义您的项目。如果你的问题是后者,上面提供的链接可以帮助你。