社区
C#
帖子详情
何时使用Dispose托管资源
513
2003-09-12 06:32:04
用浏览器做客户端的系统,Connection应该是短连接,即每次连接检索完数据后,就断开了.
并且得到的页面也是新的,是无状态的方式.那么我们使用DataSet.Dispose().是否没有必要.我认为托管的资源应该是GC自动管理的,而且是经过优化的.我们每次检索完就Dispose()可能破坏优化,反而可能使性能下降.不知我的观点是否正确,请指点!
...全文
45
6
打赏
收藏
何时使用Dispose托管资源
用浏览器做客户端的系统,Connection应该是短连接,即每次连接检索完数据后,就断开了. 并且得到的页面也是新的,是无状态的方式.那么我们使用DataSet.Dispose().是否没有必要.我认为托管的资源应该是GC自动管理的,而且是经过优化的.我们每次检索完就Dispose()可能破坏优化,反而可能使性能下降.不知我的观点是否正确,请指点!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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#中的非
托管
资源
释放 (Finalize和
Dispose
)
c#中的非
托管
资源
释放 (Finalize和
Dispose
),在了解Finalize和
Dispose
之前,我们需要了解两个概念,一个是
托管
资源
,一个非委托
资源
探讨C#中
Dispose
方法与Close方法的区别详解
群里有人问,怎样直接清空堆里的string值。有人建议直接用
Dispose
()方法;
Dispose
()销毁了对象,是一种垃圾回收机制。(这里用using或许更好)当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供
Dispose
(),那么
Dispose
和Close到底有什么区别? 在这里,要明确一下C#程序(或者说.NET)中的
资源
。简单的说来,C#中的每一个类型都代表一种
资源
,而
资源
又分为两类:
托管
资源
:由CLR管理分配和释放的
资源
,即由CLR里new出来的对象;非
托管
资源
:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、
C#
资源
释放方法实例分析
本文实例讲述了C#
资源
释放方法。分享给大家供大家参考,具体如下: 1、try{}finally{} 2、using 只有类型实现了IDisposable接口并且重写
Dispose
()方法可以
使用
using语句实现
资源
释放. 首先来看MSDN中关于这个接口的说明: [ComVisible(true)] public interface IDisposable { // Methods void
Dispose
(); } 1.[ComVisible(true)]: 指示该
托管
类型对 COM 是可见的. 2.此接口的主要用途是释放非
托管
资源
。 当不再
使用
托管
对象时,垃圾回收器会自动释放分配给该对
C#中标准的I
Dispose
模式代码详解
C#实现I
Dispose
接口 .net的GC机制有两个问题:首先GC并不能释放所有
资源
,它更不能释放非
托管
资源
。其次,GC也不是实时的,所有GC存在不确定性。 为了解决这个问题donet提供了析构函数 public class TestClass : System.IDisposable { //供程序员显式调用的
Dispose
方法 public void
Dispose
() { //调用带参数的
Dispose
方法,释放
托管
和非
托管
资源
Dispose
(true); //手动调用了
Dispose
释放
资源
,那么析构函数就是不必要的了,这里阻止GC调用析构
C#多线程开发多个实例
多个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
(); } } }
C#
110,534
社区成员
642,575
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章