学习IDisposable,对于此中的不解……请高手指点
2009-09-25 11:25
197 查看
今天有时间了,学习了下IDisposable,在园子里看了不少文章,受益很多,在此先谢过各位大侠了,在Reflector里面看到了一个实现,自己感觉还不错,先copy出来,防止忘记啊,
Code
class ResourcePool
{
// Fields
private TimerCallback _callback;
private bool _disposed;
private int _iDisposable;
private TimeSpan _interval;
private int _max;
private ArrayList _resources;
private Timer _timer;
// Methods
internal ResourcePool(TimeSpan interval, int max)
{
this._interval = interval;
this._resources = new ArrayList(4);
this._max = max;
this._callback = new TimerCallback(this.TimerProc);
}
public void Dispose()
{
this.Dispose(true);
}
private void Dispose(bool disposing)
{
lock (this)
{
if (!this._disposed)
{
if (this._resources != null)
{
foreach (IDisposable disposable in this._resources)
{
disposable.Dispose();
}
this._resources.Clear();
}
if (this._timer != null)
{
this._timer.Dispose();
}
this._disposed = true;
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
}
~ResourcePool()
{
this.Dispose(false);
}
// 其它省略了,不是这篇的重点
}这个算做为备忘录吧。上面的代码可以防止重复释放,也加锁了,不会出现线程不安全的情况了,(我这样理解的,不知道对不)
可是我现在有个疑问了,对于if(disposing){GC.SuppressFinalize(this);}在这里,我们需要做的是释放托管资源,并告诉GC,不用再释放了。
/article/5899392.html在这篇有提到对于一些托管资源的释放,像DataSet,需要手动释放。
现在问题来了,如果我们这里不手动释放DataSet这样的管托资源,会出现什么状况呢??GC还会在回收吗?如果会的话,SuppressFinalize不是请求系统不要调用指定对象的终结器的吗?还请各路高手不吝指教,谢谢了~
Code
class ResourcePool
{
// Fields
private TimerCallback _callback;
private bool _disposed;
private int _iDisposable;
private TimeSpan _interval;
private int _max;
private ArrayList _resources;
private Timer _timer;
// Methods
internal ResourcePool(TimeSpan interval, int max)
{
this._interval = interval;
this._resources = new ArrayList(4);
this._max = max;
this._callback = new TimerCallback(this.TimerProc);
}
public void Dispose()
{
this.Dispose(true);
}
private void Dispose(bool disposing)
{
lock (this)
{
if (!this._disposed)
{
if (this._resources != null)
{
foreach (IDisposable disposable in this._resources)
{
disposable.Dispose();
}
this._resources.Clear();
}
if (this._timer != null)
{
this._timer.Dispose();
}
this._disposed = true;
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
}
~ResourcePool()
{
this.Dispose(false);
}
// 其它省略了,不是这篇的重点
}这个算做为备忘录吧。上面的代码可以防止重复释放,也加锁了,不会出现线程不安全的情况了,(我这样理解的,不知道对不)
可是我现在有个疑问了,对于if(disposing){GC.SuppressFinalize(this);}在这里,我们需要做的是释放托管资源,并告诉GC,不用再释放了。
/article/5899392.html在这篇有提到对于一些托管资源的释放,像DataSet,需要手动释放。
现在问题来了,如果我们这里不手动释放DataSet这样的管托资源,会出现什么状况呢??GC还会在回收吗?如果会的话,SuppressFinalize不是请求系统不要调用指定对象的终结器的吗?还请各路高手不吝指教,谢谢了~
相关文章推荐
- 分享一个高手的python学习随笔。对于入门的新手有很大帮助
- 给些网络视频教学也行啊 请教高手给我指点下 要买书也不不知道买什么好 我一点基础都没有 但不知道怎么学 我想学习C语言 谢谢了
- 学习查找替换却不知道汉字是怎么样替换查找看见的高手指点下
- 从现在开始学习一下在 Office 平台上进行开发一些简单的应用程序,欢迎有从事这方面的高手和同道指点交流。
- 最近在学习PHP,望高手多多指点
- 记录自己学习C++的点滴,(高手请指点) 偶能承受打击
- 成为Java高手的25个学习目标
- java从新手到高手的学习历程
- 从一个菜鸟到一个程序员高手的学习过程
- 对于接下来自己的规划,想学习一下分布式系统和Android手机开发。
- c++ 与 数据结构的学习笔记---欢迎大家指点
- J2EE基础:对于Spring初学者的学习建议
- 成为Java高手的25个学习要点
- 常用的DOS命令和运行命令总结(不常用的不介绍,节省学习时间成本)【高手请绕道】
- 求高手QT怎么学习?
- java学习笔记6对于制作项目,数据的存储用这个ObjectOutputStream
- Linux学习对于其命令的相关资料收集一
- 从零基础成为深度学习高手——III
- 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议
- 对于 org.apache.commons.beanutils.BeanUtils 的一些学习