C# DataTable.Rows.Add()时间随数据表大小成比例增长

C# DataTable.Rows.Add()时间随数据表大小成比例增长,c#,performance,datagridview,datatable,system.data.datatable,C#,Performance,Datagridview,Datatable,System.data.datatable,用户注意到DataGridView中的记录开始出现在屏幕上,但有一些延迟 所以我分析了日志,发现调用DataTable.Rows.Add()所需的时间与数据表中的记录量之间存在很强的相关性。 如果开始时所需时间小于0.01毫秒,那么当表中有大约10000条记录时,它将增长到1毫秒,而当表中有50000条记录时,它将增长到5毫秒。 有两个线程:一个添加记录,另一个删除记录。DataTable绑定到DataGridView,这意味着每当DataTable行集合更改时,它都会自动更新gridview

用户注意到DataGridView中的记录开始出现在屏幕上,但有一些延迟

所以我分析了日志,发现调用DataTable.Rows.Add()所需的时间与数据表中的记录量之间存在很强的相关性。 如果开始时所需时间小于0.01毫秒,那么当表中有大约10000条记录时,它将增长到1毫秒,而当表中有50000条记录时,它将增长到5毫秒。 有两个线程:一个添加记录,另一个删除记录。DataTable绑定到DataGridView,这意味着每当DataTable行集合更改时,它都会自动更新gridview

我的理解是,在表中100000这样的记录上,不应该有任何这样的延迟。 我应该考虑为DATAGIDVIEW实现虚拟模式吗?我注意到VirtualMode属性设置为true,但CellValueRequired事件未处理

代码如下所示:

var row = table.NewRow();
//manipulations with row
table.Rows.Add(row);
row.AcceptChanges();
并删除:

var row = table.Rows.Find(id);
if (row != null) {
    row.Delete();
    row.AcceptChanges();
}

是的,您必须考虑<强>未绑定< /强>您的DATABATE和DATAGRIDVIEW,并使用ValualMoad(VirtualMode不能应用绑定数据源)。


您必须在CyValueEnEdEd事件中手动绑定DATABATE(请注意每次CyValeEnEdED都可以处理同步,并可能导致索引错误)。

< P>是的,您必须考虑<强>未绑定< /强>您的DATATATE和DATAGRIDVIEW,并使用ValualMoad(VirtualMode不能应用绑定数据源)。
您必须在CellValueRequired事件中手动绑定数据表(注意同步,因为CellValueRequired每次都可以处理,并且可能导致索引错误)。

我不明白您为什么需要这一行@Olga
row.AcceptChanges()我在没有它的情况下测试了您的场景,但它仍然会将行添加到数据表中。线程是否同时运行?所以网格一直在变化?@MethodMan,它已经在那里了。我测量了table.Rows.Add(row)的时间;它增加了,我测量了row.AcceptChanges()的时间;它并没有增加,它保持在1毫秒以内。@etalon11,是的,它增加了。我不明白为什么您需要这行@Olga
row.AcceptChanges()我在没有它的情况下测试了您的场景,但它仍然会将行添加到数据表中。线程是否同时运行?所以网格一直在变化?@MethodMan,它已经在那里了。我测量了table.Rows.Add(row)的时间;它增加了,我测量了row.AcceptChanges()的时间;它不会增加,保持在1毫秒以内。@etalon11,是的,是的。谢谢,@Bioukh!我今天就去试试。可能需要一些时间,因为我以前从未这样做过。帮助链接:再次感谢,我已经实现了VirtualMode,但在我的情况下似乎没有太大帮助。问题是,有几十条记录被添加/删除到数据源中,当这种情况发生时,我会更改行数,这会导致datagrid将行添加/删除到datagrid行集合中,并且当已经有大约3-4万条记录时,此操作的成本非常高。现在我正试图限制网格中的记录数量。假设我一次只显示1000条记录,而其他记录只保留在datatable中。在开始时,我仍然会更改行数,直到它达到1000,当它达到1000时,我不会更改行数,也不会调用CellValueRequired,但我希望调用它,以便重新绘制网格中已经存在的1000个(或者不是全部1000个,而是仅那些可见的)。总而言之,在不更改RowCount属性的情况下,如何生成grid调用CellValueRequired事件?我尝试了RowCount=0,RowCount=1000,但速度太慢,Hanks,@Bioukh!我今天就去试试。可能需要一些时间,因为我以前从未这样做过。帮助链接:再次感谢,我已经实现了VirtualMode,但在我的情况下似乎没有太大帮助。问题是,有几十条记录被添加/删除到数据源中,当这种情况发生时,我会更改行数,这会导致datagrid将行添加/删除到datagrid行集合中,并且当已经有大约3-4万条记录时,此操作的成本非常高。现在我正试图限制网格中的记录数量。假设我一次只显示1000条记录,而其他记录只保留在datatable中。在开始时,我仍然会更改行数,直到它达到1000,当它达到1000时,我不会更改行数,也不会调用CellValueRequired,但我希望调用它,以便重新绘制网格中已经存在的1000个(或者不是全部1000个,而是仅那些可见的)。总而言之,如何在不更改RowCount属性的情况下调用grid CellValueRequired事件?我尝试了RowCount=0,RowCount=1000,但速度太慢