9

在调查内存泄漏时,我发现它是由在循环内多次调用 Table 上的 NewRow() 引起的。但是,创建的 DataRow 从未添加到 Table Rows 集合中,并且 Table Rows Count 从未超过零。

我的问题是为什么每次调用 NewRow 时都会占用更多内存,即使新创建的 DataRow 从未添加到 Rows 集合中,并且从 NewRow 返回的 DataRow 总是分配给相同的局部变量(从而显然丢弃了最后一个新行)。

请忽略为什么代码会创建未添加到表中的 DataRows 的问题!

4

4 回答 4

7

DataTable.NewRow() 将创建的行添加到 DataTable 的 RecordManager。我不完全确定为什么会发生这种情况,但这就是为什么它没有被 GC 释放。

似乎只有两种方法可以摆脱 DataRow:

  1. 将其添加到表中,然后将其删除。
  2. 调用 DataTable.Clear()。
于 2008-10-28T09:39:54.380 回答
6

DataRow 从 DataTable 继承架构,因此存在从 DataRow 到生成行的表架构的引用。新行在表中处于分离状态。
这就是为什么 GC 不理会新的未使用行的原因。

于 2008-10-28T09:35:17.370 回答
1

我认为你的两个问题是相关的。

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 回答