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

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

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

有帮助吗?

解决方案

DataRow从DataTable继承模式,因此DataRow引用了生成该行的表模式。新行在表中处于Detached状态。
这就是为什么GC单独留下新的未使用行。

其他提示

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

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

  1. 将其添加到表格中,然后将其删除。
  2. 调用DataTable.Clear()。

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

Table.NewRow创建一个与初始表格具有相同列格式的新数据行。

需要使用table.Rows.Add(newRow)将此新行添加到表中。你的循环将创建从未使用过的对象,因此会占用内存。 有关更多信息,请参阅此文章 http://msdn.microsoft.com/en-我们/库/ system.data.datatable.newrow.aspx

如果你创建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);//
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top