首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不冻结UI线程的情况下更改DataGrid ItemsSource?

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

Stack Overflow用户
提问于 2014-11-26 20:42:15
回答 1查看 1.4K关注 0票数 2

我有一个客户列表,并且我更新了我的DataGridItemsSource以包含客户列表。

问题是,在更改ItemsSource之后,线程将所有绑定目标更新为每个customer对象中的值,并且此操作冻结UI超过30秒。

为了解决这个问题,我尝试在另一个Thread中更改ItemsSource属性,但是这个新线程不能访问UI线程拥有的datagrid控件。

如果我将更改ItemsSource的代码放在Invoke方法中,UI将再次冻结。

代码语言:javascript
运行
复制
//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

p.s

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

EN

回答 1

Stack Overflow用户

发布于 2014-11-26 21:09:32

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

我们还可以使用虚拟化、容器回收、freezing resources和/或优化用过的Template来最小化UI线程的繁忙时间。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27149551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档