我有一个 C# WinForms 应用程序,其中包含一个 BindingList,其中填充了这样的小部件对象:
BindingList<Widget> widgetsList = new BindingList<Widget>();
一个小部件具有三个属性(一个 int、一个 string 和一个 bool)并实现了 INotifyPropertyChanged。小部件被添加到 BindingList 中,如下所示:
for (int i = 0; i < 100000; i++) // takes < 1/10 of a second to execute
{
widgetsList.Add(new Widget(intValue, stringValue, boolValue));
}
最后,我将 BindingList 设置为 DataGridView(实际上是三个 DataGridView 控件)的数据源:
dataGridView1.DataSource = widgetsList;
这段代码运行良好。但是,如果我的用户在 DataGridView 中进行了更改,然后想要放弃这些更改并重新加载原始数据,我就会遇到问题。现在我有一个按钮来执行此操作,按钮的 Click 事件处理程序中的代码如下所示:
dataGridView1.Rows.Clear() // very fast
widgetsList.Clear() // also very fast
for (int i = 0; i < 100000; i++) // takes 18.6 seconds to execute
{
widgetsList.Add(new Widget(intValue, stringValue, boolValue));
}
如您所见,此循环的执行速度比上面的相同循环慢得多(18.6 秒 vs < .1 秒)。它似乎确实有效,但我试图弄清楚瓶颈在哪里以及如何消除它。我错过了什么吗?