分配数据源时避免UI锁定/冻结?

时间:2011-04-12 16:05:45

标签: c# winforms

我正在使用MVP模式,所以我有一个几乎没有逻辑的View和一个知道如何对用户与视图的交互作出反应的Presenter。 每次我需要从服务中获取数据或者我的代码都是异步执行时,我遇到的问题是,当我分配那些(通过UI编组它们)时,我会得到10,000个需要数据绑定到Grid的项目thread)我的UI锁定很短的时间(因为Grid控件/ CurrencyManager锁定了我认为的线程)

有人知道避免这种情况的可能方法吗?

我尝试使用计时器以增量块的形式分配数据,但仍然会使UI随机冻结

干杯

2 个答案:

答案 0 :(得分:3)

您需要在后台线程上以块的形式从服务器下载数据,然后将它们附加到客户端集合对象。如果该集合对象实现INotifyCollectionChanged,则网格应自动更新。您可以使用ObservableCollectionBindable Linq获得此选项,这可能是更好的选择。

您将遇到的问题是您有一个网格一遍又一遍地重绘10,000个项目。这通常不是一个好的解决方案,但如果你得到一个带有UI虚拟化的网格,它可以工作。例如,我使用Telerik GridView控件,我在大约5000条记录中获得了良好的结果。

试图直接回答你的问题,让我给你一些建议,可以引导你走向更好的方向。无论网格控制有多酷,通过网络直接查询10,000个项目都不会太快。您可能需要考虑使用服务总线与服务器进行异步通信,并将数据副本存储在本地数据库中。我正在开发一个使用Rhino Service Bus to make a smart client的项目,即使网络连接短时间停机也能正常工作。智能客户端开发的服务总线方法应该可以消除UI锁定的痛苦,使您的应用程序更稳定,更灵活地适应网络流量。

答案 1 :(得分:2)

您应该为您的网格使用某种virtual data mod e。这将彻底消除这种问题。