我正在创建的应用程序具有一些简单的嗅探器功能,并显示用户转储数据包。数据包从转储文件中读取,转储文件用当前通信量实时更新,然后将捕获的数据包添加到Datagrid中(每个数据包都是新的行)。我使用数据绑定从转储读取器获取数据包,它实现了ICollectionChanged接口,因此在每个新包上都会通知数据格力。Datagrid使用虚拟化和延迟滚动。几乎所有的事情都很好--唯一的例外是巨大的CPU消耗。这种CPU利用率是由于我读取所有新的数据包(每秒数千),格式化它们以供显示,并为每一个数据包上升CollectionChanged事件设置格式,这些事件都会更新数据格式。对软件的要求是用户不需要实时地看到所有新的数据包--它们每秒会出现几十万个,所以没有人会注意到它们。用户只查看某些数据包,当他想要的时候,他可以向下滚动/向上滚动到适当的位置来查看他想要的数据包,并且只有在这种情况下,必须从文件中读取数据包。
问题是--我希望数据栅格每秒钟更新一次,以显示新的数据包到达了,最好是将滚动条缩放到实际的数据包数,但不需要继续读取它们、格式化和调用CollectionChanged,因为这需要CPU时间,此外,如果用户不滚动该条,就不会看到新的数据包。我被告知到达的数据包数量,所以我知道所有数据包的计数。
我试图添加假数据包(从而避免读取和格式化每一个新的数据包),但却强迫Datagrid扩展到实际的数据包计数。它几乎起作用了,因为CPU使用量下降了,只有当我滚动条时才能读取数据包。但是过了一会儿,当新的数据包被添加到Datagrid时,当前视图中的行开始随机重复,即在第一时刻,视图中的数据包显示为第1、2、3、4、5、6等,但过了一段时间,它们被显示为第1、第2、第3、第1、第2、第3。
我还试图刷新绑定--它有效,但比第一种方法消耗更多的资源,所以我放弃了它。我还试图刷新Datagrid的列表集合视图--与刷新绑定中的效果相同。
接下来的事情是,当我想在一个调用CollectionChanged中添加数据包列表时
NotifyCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, list));我得到的错误是,范围操作不受支持,由PresentationFramework.dll!System.Windows.Data.ListCollectionView.ValidateCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedEventArgs e引发)
因此,我不得不为数据包列表中的每个数据包调用CollectionChanged,这也增加了CPU的使用率。
为了总结,我想通知Datagrid有新的数据包/行,因此Datagrid滚动条将缩放为数据包的总数,但是只有当用户滚动条时才会从文件中读取数据包。
我将非常感谢每一个如何解决我的问题的建议。
我刚刚意识到,有一件重要的事情要提,对不起,我一开始就忘了告诉你。我的ObservableCollection支持某种类型的数据虚拟化,在内存中,我只持有一些必需的数据包。当新数据包到达时,我只需将新数据包的数量通知我的集合,我就不必调用Add收集方法,因为实际上我没有向它添加任何数据包--所以没有任何数据包是按惯例读取的。集合中包含有关该时刻数据包总数的信息,并且只有少量的数据包实际保存在内存中,以便网格能够显示它们。只有在必要时才会动态读取数据包,当它们没有显示时,它们才会被释放。但是要通知网格关于新数据包的信息,我必须(我不知道如何做另一种更好的方法)调用CollectionChanged,在这个调用的论证中,我需要提供每个新的数据包。而这个对CollectionChanged的调用使得数据包实际上被读取,这消耗了CPU。I希望重新划分网格,以便滚动条大小可以通知到达的新数据包,但不需要读取数据包并将CollectionChanged调用为每一个新数据包(可能每秒发生千次)。我希望只在滚动条位置改变时读取数据包,因此处理每个数据包的昂贵操作将只针对少数当前可见的数据包执行,而不是对每个数据包执行。
发布于 2012-11-28 22:12:55
如果您的DataGrid绑定到一个ObservableCollection。每个T包含有关给定数据包的信息,诀窍是使"T“类实例化非常快。
现在,听起来您正在创建每个T,并在将它们添加到集合中时计算显示所需的所有信息。
它应该只接收它的构造函数的足够信息,以便在用户滚动网格查看其行时能够检索有关数据包的信息。
https://stackoverflow.com/questions/13613807
复制相似问题