gpt4 book ai didi

c# - 我是否应该在实现INotifyPropertyChanged的大量对象上遇到性能问题?

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:14 25 4
gpt4 key购买 nike

我试图提高连接到自定义数据对象集合的DataGridView的性能。集合一旦初始化就不会真正改变大小(即,在启动时加载列表后就不会添加或删除任何数据对象),但是数据对象的属性会动态更改,并且网格基本上应该是实时显示这些数据对象。

使用标准Visual Studio设计器支持,实现IBindingListView的此集合与DataGridView数据绑定,从而导致BindingSource充当控件及其数据源之间的代理的正常角色。使用一些公开的摘要属性(例如TotalCountWithPropertyXXX),还可以将其他几个控件连接到集合类。

以前,表单上的代码实际上使用计时器来调用BindingSource.ResetBindings(false);。为了更新绑定的控件。我认为这并不理想,因此我对数据对象本身实现了基本的INotifyPropertyChanged支持,以使对象级属性更改冒泡到BindingSource,并最终使DataGridView自动更新以显示已编辑属性的新值(并且显然剥离了对BindingSource.ResetBindings的调用)。

我对INotifyPropertyChanged的实现非常不错:只是使用包含相应属性名称的字符串值从属性访问器的设置器中触发了该事件,例如:

public event PropertyChangedEventHandler PropertyChanged;

public string Name
{
get { return _name; }
set
{
if (value != _name)
{
_name = value;
NotifyPropertyChanged("Name");
}
}
}

private void NotifyPropertyChanged(String info)
{
PropertyChangedEventHandler localOnPropChanged = OnPropertyChanged;
if (localOnPropChanged != null)
{
localOnPropChanged(this, new PropertyChangedEventArgs(info));
}
}


尽管我的列表中有几百到几千个数据对象,但我确实注意到网格更新有些迟缓。在测试一些现有功能以批量更新数据对象时(从性能角度来看),致命一击来了-即,表单上有一个按钮可以翻转列表中所有数据对象的布尔属性之一。当触发此按钮的事件处理程序时,它将枚举整个数据对象列表,并将标志设置为true / false,并且UI会挂起8-10秒,然后恢复运行并用更新的布尔值标记所有对象(使用DataGridViewCheckBoxColumn)。

我的第一个想法是在按钮的事件句柄正在更新所有数据对象的同时,禁止触发BindingSource的ListChanged事件(RaiseListChangedEvents = false;),但这没有明显的区别。

我们已经进行了一些简单的跟踪,因此我查看了时间戳,日志似乎表明,基本上挂起的整个时间都花在了单元测试环境中的数千个数据对象上触发属性更改通知。

如果我注释掉由上述批量编辑按钮设置的布尔属性的属性集中的事件通知代码,则挂起会完全消失,网格又会变得活泼-但是我会牺牲网格更新(即复选框)列单元格不会更新。)

我进行了一些搜索,但没有发现太多关于实现INotifyPropertyChanged的问题,这对我正在处理的对象数量有重大影响,因此,我不确定代码中是否存在需要修复的错误- -例如,我的INotifyPropertyChanged实施效率低下,可能是我们的收藏类中IBindingListView的实施不佳,或者我们的数据绑定中有些笨拙,或者如果我达到了在不实现虚拟模式的情况下可以在DataGridView中执行的功能的极限。

现在,我取消了编写的INotifyPropertyChanged代码,并在我认为我们通过使用CellChanged上的事件处理程序,Button Click等对数据对象进行更改时尝试使网格无效,但是我忍不住感觉就像我对这里的根本性能问题不太了解,我可能选择一种不太干净的实施策略,只是因为我不了解性能问题的实质。

因此,我正在寻找有关基本方法是否可行或需要更改实施策略的指导/反馈。

TIA,
马特

最佳答案

在我们当前的应用程序中,有一些较大的网格视图,当它们变慢时,我仅拍摄了几张快照以查看发生了什么。

通常,通知一直都在浪费时间。在可能的情况下,最好不要尝试使数据与通知保持一致,而应能够容忍一些暂时的不一致并偶尔以某种方式通过一次清理来清除它。

关于c# - 我是否应该在实现INotifyPropertyChanged的大量对象上遇到性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3312442/

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