何时使用Dispose托管资源

513 2003-09-12 06:32:04
用浏览器做客户端的系统,Connection应该是短连接,即每次连接检索完数据后,就断开了.
并且得到的页面也是新的,是无状态的方式.那么我们使用DataSet.Dispose().是否没有必要.我认为托管的资源应该是GC自动管理的,而且是经过优化的.我们每次检索完就Dispose()可能破坏优化,反而可能使性能下降.不知我的观点是否正确,请指点!
...全文
45 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhan2000 2003-09-13
  • 打赏
  • 举报
回复
...Dispose()会自动调用close方法

垃圾回收有不确定性,推荐使用dispose
xz_king 2003-09-13
  • 打赏
  • 举报
回复
有必要,如果10000人同时连接,而你不释放资源,想想当时会有多少RAM被占用。

个人推荐使用:

using( SqlConnection conn = new SqlConnection){
conn.open() ;
...
conn.close() ; // 如果你忘了close, 这个代码结束时,conn也会自动回收了。
....
}
layershow 2003-09-13
  • 打赏
  • 举报
回复
建Connection
.Open();

.Close();
...Dispose()
等等....

只要有了这个操作过程(以上没问题吧?).我再用代码恢复数据库都是说数据库正在被使用
意思是资源没有被释放.
但是一关掉程序,资源马上被释放掉.有兴趣可以试试

假想一个例子
//Connection 完成
Command myCmd = new Command();
myCmd.CommandText = "...";
myCmd.Execute...();
myCmd = new Command();
myCmd.CommandText = "...";
myCmd.Execute...();
myCmd.Dispose();
// 关闭

// Connection
Command myCmd = new Command();
myCmd.CommandText = "...";
myCmd.Execute...();
myCmd.CommandText = "...";
myCmd.Execute...();
myCmd.Dispose();
// 关闭

前一个是建了两个Command实例,而第一个的Dispose没有被显式调用.估计是由GC完成吧?
它的生存期是多长我也不清楚.至少已经没有加在它上面的引用了,这可能也是GC判断是否回收
的一个标准吧?
第二个只建了一个Command实例,并且使用多次,不再使用的时候,才将它释放掉

这是我的理解,我说有点含含糊糊,也请高手指正.
ArLi2003 2003-09-13
  • 打赏
  • 举报
回复
我也觉的有必要,GC 是定时性或者被动解发的

你可以试试在析构里验证一下你清掉那个class 之后要多久才会执行到析构
cnhgj 2003-09-13
  • 打赏
  • 举报
回复
有必要,释放资源
dragonsuc 2003-09-12
  • 打赏
  • 举报
回复
看看Applied Microsoft .NET Framework Programming

你了解更深入
你的看法是正确的
多个C#多线程开发实例 using System; using System.Collections.Generic; using System.Text; namespace Example20 { class Program { class Class1 : IDisposable { //析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法 ~Class1() { Dispose(false); } //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率 void IDisposable.Dispose() { Dispose(true); } //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力 protected virtual void ReleaseUnmanageResources() { //Do something... } //私有函数用以释放非托管资源 private void Dispose(bool disposing) { ReleaseUnmanageResources(); //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法 //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦 if (disposing) { GC.SuppressFinalize(this); } } } static void Main(string[] args) { //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧 Class1 tmpObj1 = new Class1(); //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些 //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧 //当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率 Class1 tmpObj2 = new Class1(); ((IDisposable)tmpObj2).Dispose(); } } }

110,534

社区成员

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

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

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