熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

DataTable.NewRow 內存洩漏問題

2013-11-13 10:21:47  來源: .NET編程 

  先看一下有問題的代碼

  public DataRow GetNextRow()

  {

  if (_DataReaderRead())

  {

  DataRow row = _SchemaTableNewRow();

  foreach (DataColumn col in _SchemaTableColumns)

  {

  row[colColumnName] = _DataReader[colColumnName];

  }

  return row;

  } else { return null;

  }

  }

  這段代碼我希望通過SqlDataReader 對象 _DataReader 來獲取一行數據_SchemaTable 是一個DataTable 對象這個DataTable對象沒有記錄只存放Table 的Schema乍一看好像沒有什麼問題_SchemaTableNewRow() 是根據_SchemaTable 的列信息生成一個新行但這個新行並沒有調用 _SchemaTableRowsAdd 方法加入到_SchemaTable 表中一般認為這個新生成的 DataRow 在使用完後會被自動回收但實際情況並不是這樣只要_SchemaTable 不釋放_SchemaTableNewRow 生成的所有DataRow都無法釋放

  網上搜了一下有一位仁兄和我遇到同樣問題 Table NewRow() Causes Memory Leak

  被采納的解決意見是這樣的

  DataTableNewRow() adds the created row to the DataTables 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 two ways to get rid of the DataRow:

  Add it to the table then delete it

  Call DataTableClear()

  也就是說DataTableNewRow 方法創建的DataRow 對象會被加入到DataTable 的 RecordManager 中我們可以通過以下兩種方法來釋放掉它

   通過 DataTableRowsAdd 方法將這一行加入到DataTable 中然後再通過 DataTableRowsRemove 方法刪除它

   調用 DataTableClear() 方法釋放

  由於我這個應用中數據表只存放架構信息始終是空表所有我采用了第種方法加入 _SchemaTableClear() 這一句後內存洩漏問題解決

  改正後的代碼如下

  public DataRow GetNextRow()

  {

  if (_DataReaderRead())

  { DataRow row = _SchemaTableNewRow(); foreach (DataColumn col in _SchemaTableColumns)

  {

  row[colColumnName] = _DataReader[colColumnName];

  }

  _SchemaTableClear(); return row;

  }

  else

  {

  return null;

  }

  }

  不好意思上面代碼還是有問題 _SchemaTableClear() 後DataRow 裡面的數據都會被清空必須在調用完新生成的DataRow後再 _SchemaTableClear 才行特此更正


From:http://tw.wingwit.com/Article/program/net/201311/13387.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.