您的位置:首页 > 其它

学习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不是请求系统不要调用指定对象的终结器的吗?还请各路高手不吝指教,谢谢了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: