我需要以相当高的频率添加网格中的大量行(在某些情况下每秒最多10行)我选择了ListView,因为我认为它是WPF中最快的网格控件.(当然比GridView快很多)
CPU利用率得到相当高的后添加夫妇十万的项目和他们继续进来,这是相当令人惊讶的,因为呈现的ListView只可见行,所以它不应该不管有多少总共相加.
我的第一种方法是将它绑定到ObservableCollection但过了一会儿,CPU利用率上升,整个Window变得紧张.
比我尝试将它绑定到常规列表,这看起来更快,但我确实需要经常调用列表上的.Refresh(),这一段时间也会扼杀CPU.
比我试图继承的ObservableCollection,以块插片希望他们分批将提高性能/降低CPU的工作负荷,但这种做法似乎需要调用CollectionView.Refresh这是一样的呼吁收集复位(),并且当有很多ineficient集合中的项目.
清除observablecollection并调用myListView.Items.Refresh()将其恢复为0会将cpu使用带回到起始点.
开始的想法跑这里来了这里..同样,我的目的,是增加/显示大量的项目和显示8柱网,在最高效的方式..的ListView似乎不错,那里只是有一些方法我可以进一步调整它..
UPDATE
在分析后,ObservableCollection在网格中有800k行,最多的cpu工作是通过以下方式完成的:
虽然取决于会话,这些数字差异很大..
更新2 ..确定BindingList似乎是明显的赢家.
这里是结果(以刻度表示)并排,每行100万行(每秒添加10个项目):
ObservableCollection:http: //i.imgur.com/7ZoSv.png
BindingList http://i.imgur.com/jm5qF.png
你可以看到CPU活动的整体下降,以及在Binding List案例中处理树所需的大约一半的滴答!感谢Akash这个好主意.
Aka*_*ava 19
而不是使用ObservableCollection我会建议BindingList类,你可以做这样的事情..
BindingList<string> list = new BindingList<string>();
list.AllowEdit = true;
list.AllowNew = true;
list.AllowRemove = true;
// set the list as items source
itemCollection.ItemsSource = list;
// add many items...
// disable UI updation
list.RaiseListChangedEvents = false;
for each(string s in MyCollection){
list.Add(s);
}
// after all.. update the UI with following
list.RaiseListChangedEvents = true;
list.ResetBindings(); // this forces update of entire list
Run Code Online (Sandbox Code Playgroud)
您甚至可以批量启用/禁用更新,而不是一次性添加所有内容,BindingList在我的所有UI中的功能都比ObservableCollection更好,我想知道为什么当BindingList真正取代ObservableCollection时,每个人都会更多地谈论ObservableCollection.
| 归档时间: |
|
| 查看次数: |
8890 次 |
| 最近记录: |