我通过调用DataTable.LoadDatatRow
刷新数据表,如下所示:
public void FillTable(DataTable myTable, IEnumerable<MyObject> readings)
{
var index=0;
foreach(var reading in readings) {
LoadRow(myTable, reading, index++);
}
}
protected override void LoadRow(DataTable table, MyObject objectValue, int index)
{
table.LoadDataRow(
new object[] {
objectValue.property1 + "a",
objectValue.property2 + "b",
/* ... etc. */
}, LoadOption.OverwriteChanges);
}
现在,这有点简化了可读性,LoadDataRow
行有点长(大约9个数组值),但不包含大函数调用或任何东西,只是格式化字符串和一些{{1案件。当我的表中有大约50个值时,此代码工作正常,我得到大约10 Hz的刷新。但是,一旦我得到的值超过正常值(比如说200),它就会呈指数级增长,达到0.2 Hz。这太慢了。
有没有人知道为什么当我有大量的读数时,我会出现指数减速?是否与?
有关(我非常确定我需要其他原因);或者可能在OverWriteChanges
内创建一个对象,还是有其他原因?
我玩过不同的LoadDataRow
,这似乎不是问题所在。我无法解释为什么我看到处理时间大幅增加,我无法弄清楚如何修复它。
答案 0 :(得分:2)
在调用LoadRow之前和之后添加对BeginLoadData()和EndLoadData()的调用。
BeginLoadData关闭事件通知,索引维护和与新数据处理相关的约束检查。这可以提高LoadDataRow的性能。
public void FillTable(DataTable myTable, IEnumerable<MyObject> readings)
{
var index=0;
try
{
dt.BeginLoadData();
foreach(var reading in readings) {
LoadRow(myTable, reading, index++);
}
}
finally
{
dt.EndLoadData();
}
}
还要确保在发生故障时恢复正常处理。