gpt4 book ai didi

c# - 向WPF Datagrid添加很多项目会消耗大量CPU时间

转载 作者:太空宇宙 更新时间:2023-11-03 16:22:01 24 4
gpt4 key购买 nike

我正在创建具有一些简单嗅探器功能并显示用户转储数据包的应用程序。从转储文件中读取数据包,转储文件会根据当前流量进行实时更新,然后将捕获的数据包添加到Datagrid(每个数据包都是新行)。我使用数据绑定从实现ICollectionChanged接口的转储读取器获取数据包,因此将向每个新数据包通知Datagrid。 Datagrid使用虚拟化和延迟滚动。几乎所有东西都可以正常工作-唯一的例外是CPU消耗巨大。 CPU利用率的提高是由于我读取了所有新数据包(每秒千个),将它们格式化以进行显示以及每个数据包上升的CollectionChanged事件都会更新Datagrid。对软件的要求是用户不必实时查看所有新数据包-它们每秒显示成千上万,因此没有人会注意到它们。用户只能查看某些数据包,并且当他需要时,他可以上下滚动条到合适的位置以查看他想要的数据包,只有在这种情况下,才必须从文件中读取数据包。

问题是我希望Datagrid每秒更新一次,以显示新的数据包到达,最好是通过将滚动条缩放到实际的数据包数量来实现,但是不需要连续读取它们,格式化并调用CollectionChanged,因为这需要花费CPU时间,并且另外如果用户不滚动条,则不会看到新的数据包。我被告知到达的数据包数量,因此我知道所有数据包的计数。

我试图添加伪造的数据包(从而避免读取和格式化每个新数据包),只是迫使Datagrid扩展到实际的数据包数量。它几乎起作用了,因为当我滚动条时,CPU使用率下降并且数据包只能读。但是过了一会儿,当新的数据包被添加到Datagrid时,当前视图中的行开始随机重复,即
在视图的第一瞬间,数据包分别显示为1st,2nd,3rd,4th,5th,6th等,但是过了一会儿,它们分别显示为1st,2nd,3rd和1st,2nd,3rd。

我还尝试刷新绑定-它起作用,但是比第一种方法消耗了更多资源,因此我放弃了它。我还尝试刷新Datagrid的listcollectionview-与刷新绑定相同的效果。

接下来的事情是,当我想在一次对CollectionChanged的调用中添加数据包列表时

NotifyCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, list));


我收到不支持Range操作的错误,由PresentationFramework.dll!System.Windows.Data.ListCollectionView.ValidateCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)引发

因此,我必须为数据包列表中的每个数据包调用CollectionChanged,这也增加了CPU使用率。

总而言之,我想通知Datagrid有新的数据包/行,因此Datagrid滚动条将按比例缩放到数据包总数,但是只有在用户滚动条时才从文件读取数据包。

我将非常感谢每一个建议如何解决我的问题。

我刚刚意识到,有一件重要的事情要提,对不起,我忘了一开始就谈到。我的ObservableCollection支持某种数据虚拟化,在内存中,我仅容纳一些必要的数据包。当新数据包到达时,我只是通知我的集合有关新数据包的数量,而不必调用集合的Add方法,因为我实际上没有向其中添加任何数据包-因此不会正确读取任何数据包。收集具有有关那一刻的数据包总数的信息,而实际上只有少量数据包保存在内存中,以便网格可以显示它们。仅在必要时动态读取数据包,并且不显示时将其释放。
但是要通知网格有关新数据包的信息,我必须(我不知道如何做,这是一种更好的方法)调用CollectionChanged,并且在此调用的参数中,我需要提供每个新数据包。对CollectionChanged的此调用使数据包实际上被读取,这消耗了CPU。我想重新缩放网格,以便滚动条大小可以通知新的数据包到达,但不必读取数据包并为每个新数据包调用CollectionChanged(每秒可能发生千次)。我希望仅在滚动条位置更改时才读取数据包,因此处理每个数据包的昂贵操作将仅针对少数当前可见的数据包执行,而不是针对每个数据包执行。

最佳答案

如果您将DataGrid绑定到ObservableCollection。而且每个T都包含有关给定数据包的信息,诀窍是使“ T”类实例化非常快。

现在,听起来好像您正在创建每个T并在将它们添加到集合中时计算显示所需的所有信息。

它应该只接受其构造函数足够的信息,以便以后用户滚动网格以查看其行时可以检索有关数据包的信息。

关于c# - 向WPF Datagrid添加很多项目会消耗大量CPU时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13613807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com