1

我通过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 个数组值),但不包含大的函数调用或任何东西,只是格式化字符串和一些?情况。当我的表中有约 50 个值时,此代码可以正常工作,并且刷新频率约为 10 Hz。但是一旦我得到比正常更多的值(比如 200),它就会呈指数增长,我得到 ~0.2 Hz。这太慢了。

有谁知道为什么当我有大量可枚举的读数时,我的速度会呈指数级下降?是否与它有关OverWriteChanges(我很确定我需要其他原因);或者可能在 中创建一个对象LoadDataRow,还是有其他原因?

我玩过不同的游戏LoadOptions,这似乎不是问题。我只是无法解释为什么我看到处理时间如此巨大的增加,而且我不知道如何解决它。

4

1 回答 1

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();
    }
}

也一定要在失败的情况下恢复正常处理。

于 2013-05-07T18:35:53.117 回答