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 に答える