知识大全 DataTable.NewRow 内存泄漏问题
Posted 知
篇首语:行是知之始,知是行之成。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 DataTable.NewRow 内存泄漏问题相关的知识,希望对你有一定的参考价值。
DataTable.NewRow 内存泄漏问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
先看一下有问题的代码
public DataRow GetNextRow()
if (_DataReader Read())
DataRow row = _SchemaTable NewRow();
foreach (DataColumn col in _SchemaTable Columns)
row[col ColumnName] = _DataReader[col ColumnName];
return row;
else return null;
这段代码我希望通过SqlDataReader 对象 _DataReader 来获取一行数据 _SchemaTable 是一个DataTable 对象 这个DataTable对象没有记录 只存放Table 的Schema 乍一看好像没有什么问题 _SchemaTable NewRow() 是根据_SchemaTable 的列信息生成一个新行 但这个新行并没有调用 _SchemaTable Rows Add 方法加入到_SchemaTable 表中 一般认为这个新生成的 DataRow 在使用完后会被自动回收 但实际情况并不是这样 只要_SchemaTable 不释放 _SchemaTable NewRow 生成的所有DataRow都无法释放
网上搜了一下 有一位仁兄和我遇到同样问题 Table NewRow() Causes Memory Leak
被采纳的解决意见是这样的
DataTable NewRow() adds the created row to the DataTable s RecordManager
I am not entirely sure why this happens but this is why it is not freed by the GC
It appears that there are only o ways to get rid of the DataRow:
Add it to the table then delete it
Call DataTable Clear()
也就是说DataTable NewRow 方法创建的DataRow 对象会被加入到DataTable 的 RecordManager 中 我们可以通过以下两种方法来释放掉它
通过 DataTable Rows Add 方法将这一行加入到DataTable 中 然后再通过 DataTable Rows Remove 方法删除它
调用 DataTable Clear() 方法释放
由于我这个应用中数据表只存放架构信息 始终是空表 所有我采用了第 种方法 加入 _SchemaTable Clear() 这一句后内存泄漏问题解决
改正后的代码如下
public DataRow GetNextRow()
if (_DataReader Read())
DataRow row = _SchemaTable NewRow(); foreach (DataColumn col in _SchemaTable Columns)
row[col ColumnName] = _DataReader[col ColumnName];
_SchemaTable Clear(); return row;
else
return null;
cha138/Article/program/net/201311/13387
相关参考