告急!!!!!!!!!!!!资源回收问题!!!

wo1986620 2009-12-04 11:35:11
OleDbConnection conn = DB.CreateConn();
string strComm = "select * from EmailAddress";
OleDbDataAdapter oda = new OleDbDataAdapter(strComm, conn);
DataTable dt = new DataTable();
oda.Fill(dt);
DataList1.DataSource = dt;
DataList1.DataBind();
dt.Dispose();
Response.Write(dt.Rows[0][0].ToString());


为什么 dt在调用了dispose()之后,竟然还可以使用,里面的内容一样可以输出、?
到底是怎么回事??????
...全文
93 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wo1986620 2009-12-05
  • 打赏
  • 举报
回复
Neil198 说的正是我要考虑的,因为一次性读取的数据庞大,而且前台页面过多的使用ajax ,所以希望这个dataTable能在确定的时间内销毁掉,不过听一些人说,直接调用GC.Collect会提高cpu的性能消耗,不知道是不是真的, 所以我打算这样写, dt.clear();
dt.dispose();
这样dt的内容清光后,就等着GC来处理空的dt 不知道怎么样?
tianrui456 2009-12-04
  • 打赏
  • 举报
回复
或者你可以用 GC.Collect () 来显示的调用垃圾处理
改变代码:
DataList1.DataBind();
dt.Dispose();
GC.Collect ();
Response.Write(dt.Rows[0][0].ToString());
试试 会有什么效果.
tianrui456 2009-12-04
  • 打赏
  • 举报
回复
垃圾回收器回收垃圾包括:没有被引用的托管对象,生存期过期的对象
你上面的对象指针即没有释放对datatable的引用,也没有过生存期 所以垃圾回收处理器没有回收它,既然没有回收你指向这块内存的指针当然可以访问到它了....
足球中国 2009-12-04
  • 打赏
  • 举报
回复
对于对象的释放,有个标准的类。
你可以搜一下。或者去大虾那本翻看一下。
足球中国 2009-12-04
  • 打赏
  • 举报
回复
DataTable对象是非托管资源 ??????????? 不会把,即使是非托管对象,dispose()也可以销毁的呀, 而且 我如果试用那个重载方法dispose(true) 结果会报异常,说资源无法访问

DataTable对象应该是托管资源。

[[即使是非托管对象,dispose()也可以销毁的呀, ]]

这句话错误。 非托管对象没有这个接口dispose.更不用说调用。
lei19890721 2009-12-04
  • 打赏
  • 举报
回复
up
Neil198 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 wo1986620 的回复:]
        OleDbConnection conn = DB.CreateConn();
        string strComm = "select * from EmailAddress";
        OleDbDataAdapter oda = new OleDbDataAdapter(strComm, conn);
        DataTable dt = new DataTable();
        oda.Fill(dt);
        DataList1.DataSource = dt;
        DataList1.DataBind();
       dt.Dispose();
        Response.Write(dt.Rows[0][0].ToString());
 
    为什么 dt在调用了dispose()之后,竟然还可以使用,里面的内容一样可以输出、?
  到底是怎么回事??????
     
[/Quote]
调用dispose()会等待垃圾回收来回收他,回收的时间是系统自己判断的,采取最优的时间,如果你想销毁他就让dt = null,然后手动调用一下GC,或者不调用等待自动回收
wo1986620 2009-12-04
  • 打赏
  • 举报
回复
DataTable对象是非托管资源 ??????????? 不会把,即使是非托管对象,dispose()也可以销毁的呀, 而且 我如果试用那个重载方法dispose(true) 结果会报异常,说资源无法访问
wo1986620 2009-12-04
  • 打赏
  • 举报
回复
我是要销毁这个dt 而不仅仅是清空它,
PandaIT 2009-12-04
  • 打赏
  • 举报
回复
DataTable对象是非托管资源

具体参见:http://blog.csdn.net/Knight94/archive/2006/08/05/1023352.aspx
HooverHuang 2009-12-04
  • 打赏
  • 举报
回复
先关闭数据库连接,然后清空就 OK了
stning 2009-12-04
  • 打赏
  • 举报
回复
dt.Dispose();
并不是清空数据。清空数据是clear();
Neil198 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cuike519 的回复:]

再说,托管资源需要你手动释放么?如果需要你手动释放还要垃圾收集器有屁用。下面是MSDN对IDisposable接口的描述,请看清楚了再说话好么?
[/Quote]
手动释放没用??

IDisposable 接口 MSDN的解释:
此接口的主要用途是释放非托管资源。当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存。但无法预测进行垃圾回收的时间。另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无所知。


如果手动释放没用那还有GC.Collect这个方法干嘛用? 在合适的时间进行手动释放肯定会减少资源占用。滥用的话反而会影响程序的稳定性。正如MSDN上说的:垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。
cuike519 2009-12-04
  • 打赏
  • 举报
回复
我实在受不鸟了...

麻烦大哥看看代码再说好么,麻烦把概念整清楚了再说好么?

DataTable的Dispose方法是继承于MarshalByValueComponent,因为这个基类实现了IComponent接口。

首先DataTable不是非托管对象,这个对象是被分配到托管堆上的怎么可能是非托管的对象???
其次IDisposable接口是用来释放已经分配的资源,而且这个接口是.NET里面的一种模式,这种模式专门来释放费托管资源的。

再说,托管资源需要你手动释放么?如果需要你手动释放还要垃圾收集器有屁用。下面是MSDN对IDisposable接口的描述,请看清楚了再说话好么?

The primary use of this interface is to release unmanaged resources. The garbage collector automatically releases the memory allocated to a managed object when that object is no longer used. However, it is not possible to predict when garbage collection will occur. Furthermore, the garbage collector has no knowledge of unmanaged resources such as window handles, or open files and streams.

Use the Dispose method of this interface to explicitly release unmanaged resources in conjunction with the garbage collector. The consumer of an object can call this method when the object is no longer needed.

111,120

社区成员

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

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

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