有没有办法加快datatable.LoadDataRow()?

时间:2013-05-07 18:01:14

标签: c# performance datatable ienumerable loadoptions

我通过调用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,这似乎不是问题所在。我无法解释为什么我看到处理时间大幅增加,我无法弄清楚如何修复它。

1 个答案:

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

还要确保在发生故障时恢复正常处理。