9

メモリ リークを調査しているときに、ループ内の Table で NewRow() を何度も呼び出すことが原因であることがわかりました。ただし、作成された DataRow が Table Rows コレクションに追加されることはなく、Table Rows Count が 0 を超えることもありませんでした。

私の質問は、新しく作成された DataRow が Rows コレクションに追加されず、NewRow から返された DataRow が常に同じローカル変数に割り当てられているにもかかわらず、NewRow が呼び出されるたびにこれがより多くのメモリを使用するのはなぜですか (したがって、明らかに最後の新しい行を破棄します) )。

なぜコードがテーブルに追加されない DataRows を作成するのかという問題は無視してください!

4

4 に答える 4

7

DataTable.NewRow() は、作成された行を DataTable の RecordManager に追加します。なぜこれが起こるのか完全にはわかりませんが、これが GC によって解放されない理由です。

DataRow を取り除くには、次の 2 つの方法しかないようです。

  1. テーブルに追加してから、削除します。
  2. DataTable.Clear() を呼び出します。
于 2008-10-28T09:39:54.380 に答える
6

DataRow は DataTable からスキーマを継承するため、DataRow から行を生成したテーブル スキーマへの参照があります。新しい行は、テーブルで Detached 状態にあります。
これが、GC が新しい未使用の行をそのままにした理由です。

于 2008-10-28T09:35:17.370 に答える
1

あなたの2つの問題は関連していると思います。

Table.NewRow は、最初のテーブルと同じ列形式を持つ新しいデータ行を作成します。

この新しい行は、table.Rows.Add(newRow) を使用してテーブルに追加する必要があります。ループは決して使用されないオブジェクトを作成するため、メモリを消費します。詳細については、この記事を参照してください http://msdn.microsoft.com/en-us/library/system.data.datatable.newrow.aspx

于 2008-10-28T09:26:40.150 に答える
0

newRow = table.NewRow() を作成してから、以下のコードでこの newRow よりも必要ないと判断した場合。1) テーブルに if 行を追加します。2)削除すると、メモリリークが防止されます。

    var table = new DataTable();
    while (true)
    {
        var newRow = table.NewRow();
        table.Rows.Add(newRow);   //Without this 2 rows you will have memory leak.
        table.Rows.Remove(newRow);//
    }
于 2018-07-12T06:57:23.323 に答える