DataTable.NewRow 内存无法释放问题

紫川娃哈哈 2013-05-10 02:24:16
/// <summary>
/// 将datatable的column的数据类型转换成指定的数据类型
/// </summary>
/// <param name="toDealTable"></param>
/// <param name="ObjPropertyDocuments"></param>
/// <returns></returns>
public static DataTable CovertTableType(DataTable toDealTable, List<MOD_OBJPROPERTY> ObjPropertyDocuments)
{
DataTable dt = CreateTabelWithType(ObjPropertyDocuments);
foreach (DataRow dr in toDealTable.Rows)
{
DataRow drNew = dt.NewRow();

foreach (DataColumn dc in dt.Columns)
{
try
{
if (dc.DataType == typeof(decimal))
{
String value = dr[dc.ColumnName].ToString().Trim();
if (value == String.Empty)
{
drNew[dc.ColumnName] = DBNull.Value;
}
else
{
drNew[dc.ColumnName] = dr[dc.ColumnName] == DBNull.Value ? 0 : Convert.ToDecimal(dr[dc.ColumnName]);
}
continue;
}
if (dc.DataType == typeof(long))
{
String value = dr[dc.ColumnName].ToString().Trim();
if (value == String.Empty)
{
drNew[dc.ColumnName] = DBNull.Value;
}
else
{
drNew[dc.ColumnName] = dr[dc.ColumnName] == DBNull.Value ? 0 : Convert.ToInt64(value);
}
continue;
}
drNew[dc.ColumnName] = dr[dc.ColumnName];

}
catch (System.Exception ex)
{
LogUtil.LogError(dc.ColumnName, ex);
LogUtil.LogDebug(dc.ColumnName);
throw ex;
}
}
dt.Rows.Add(drNew);


}
return dt;
}

上面这个方法在程序中,会产生很多无法释放内存资源的NewRow,请问下我应该怎么做呢?
参考:http://www.cnblogs.com/eaglet/archive/2009/10/14/1582928.html
...全文
293 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫川娃哈哈 2013-05-13
  • 打赏
  • 举报
回复
修改:2.因为是一个静态类(是静态方法)
紫川娃哈哈 2013-05-13
  • 打赏
  • 举报
回复
引用 6 楼 q107770540 的回复:
当使用 NewRow 创建新行时,必须先将这些行添加到数据表或从数据表中删除这些行,然后再调用 Clear。 I think you will need to call Delete and then AcceptChanges on the row to detach it from the table. http://stackoverflow.com/questions/8122941/datarow-not-collected-by-gc
1.上面的方法中,我已经将创建的新行添加到DataTable(dt)中了。 2.因为是一个静态类,dt直接作为返回值返回到一个DataSet中。 3.接着,这个DataSet数据被我封装到一个名为A的类中。 4.最后,在A中的DataSet使用完毕后,我调用A的Dispose()方法将它clear()掉。 但是,这部分内存还是没有释放。 先谢谢督察了!
q107770540 2013-05-13
  • 打赏
  • 举报
回复
当使用 NewRow 创建新行时,必须先将这些行添加到数据表或从数据表中删除这些行,然后再调用 Clear。 I think you will need to call Delete and then AcceptChanges on the row to detach it from the table. http://stackoverflow.com/questions/8122941/datarow-not-collected-by-gc
紫川娃哈哈 2013-05-13
  • 打赏
  • 举报
回复
引用 3 楼 squrreal 的回复:
具体什么情况啊?
就是程序执行完,NewRow出来的内存资源没有被GC回收。 我这个程序是要定时跑的,3天左右服务器内存就告急了
紫川娃哈哈 2013-05-13
  • 打赏
  • 举报
回复
引用 2 楼 q107770540 的回复:
catch (System.Exception ex)
                    {
                        LogUtil.LogError(dc.ColumnName, ex);
                        LogUtil.LogDebug(dc.ColumnName);
                        drNew = NULL;
                        throw ex;
                    }
drNew = NULL 我用过了 可是最后还是不能被GC回收掉(手动回收)
squrreal 2013-05-13
  • 打赏
  • 举报
回复
具体什么情况啊?
q107770540 2013-05-13
  • 打赏
  • 举报
回复
catch (System.Exception ex)
                    {
                        LogUtil.LogError(dc.ColumnName, ex);
                        LogUtil.LogDebug(dc.ColumnName);
                        drNew = NULL;
                        throw ex;
                    }
紫川娃哈哈 2013-05-13
  • 打赏
  • 举报
回复
自己顶一下,大神们来帮个忙吧
紫川娃哈哈 2013-05-13
  • 打赏
  • 举报
回复
引用 9 楼 blackvis 的回复:
1.上面的方法中,我已经将创建的新行添加到DataTable(dt)中了。 2.因为是一个静态类,dt直接作为返回值返回到一个DataSet中。 3.接着,这个DataSet数据被我封装到一个名为A的类中。 4.最后,在A中的DataSet使用完毕后,我调用A的Dispose()方法将它clear()掉。 看上面代码 问题应该不是出现在这个方法中 而出在步骤3中的可能性比较大! 调Dispose不掉实际区别不是很大,关键是你这个A类中的dataSet是否被其他地方引用了。或者是静态的?全局的? 我预测是A类中的 DataSet 是成员变量, 然后A类实例化的某对象你的JOB创建时就一直存在...
1.我这个程序是多线程的,有个线程池管理所有线程。 2.一个线程用完后不会释放,而是等待下个JOB来使用。 应该就是这个原因了吧,这个线程一直保存着最后一次执行时所用的资源。
blackvis 2013-05-13
  • 打赏
  • 举报
回复
1.上面的方法中,我已经将创建的新行添加到DataTable(dt)中了。 2.因为是一个静态类,dt直接作为返回值返回到一个DataSet中。 3.接着,这个DataSet数据被我封装到一个名为A的类中。 4.最后,在A中的DataSet使用完毕后,我调用A的Dispose()方法将它clear()掉。 看上面代码 问题应该不是出现在这个方法中 而出在步骤3中的可能性比较大! 调Dispose不掉实际区别不是很大,关键是你这个A类中的dataSet是否被其他地方引用了。或者是静态的?全局的? 我预测是A类中的 DataSet 是成员变量, 然后A类实例化的某对象你的JOB创建时就一直存在...

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧