连接池:如何正确实现IDisposable将TCP连接返回池
问题描述:
我试图实现TCP连接池并使用IDisposable将连接返回池。我想知道如果我的实现是正确的,它似乎工作,但我认为,因为基类也实现了IDisposable和finalize,我的代码可能是泄漏。连接池:如何正确实现IDisposable将TCP连接返回池
public class BaseClass : IDisposable
{
internal bool IsDisposed { get; set; }
private object someResource;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~BaseClass()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (someResource != null)
{
// some clearn up
return;
}
if (disposing)
{
//dispose un managed resources
}
}
}
public class ChildClass : BaseClass
{
// adds some functionality
}
public class MyClass : ChildClass, IDisposable
{
MyPoolManager manager = null;
public MyClass(MyPoolManager manager)
{
this.manager = manager;
}
public new void Dispose()
{
manager.ReturnPooledConnection(this);
}
}
public class MyPoolManager
{
private static MyPoolManager instance = new MyPoolManager();
private static object objLock = new object();
private static Queue<MyClass> que = null;
private string name;
static MyPoolManager()
{
que = new Queue<MyClass>();
// enqueue some instances of MyClass here
MyClass client = new MyClass(instance);
que.Enqueue(client);
}
private MyPoolManager() { }
public MyPoolManager(string name)
{
this.name = name;
}
public MyClass GetPooledConnection()
{
lock (objLock)
{
while (que.Count == 0)
{
if (!Monitor.Wait(objLock, 1000))
throw new TimeoutException("Connection timeout");
}
return que.Dequeue();
}
}
public void ReturnPooledConnection(MyClass client)
{
lock (objLock)
{
que.Enqueue(client);
Monitor.Pulse(objLock);
}
}
}
你会在你的程序中使用它像这样:
MyPoolManager pool = new MyPoolManager();
using (var conn = pool.GetPooledConnection())
{
// use the conn here
}
// when you reach here the conn should have returned back to the pool
答
MyClass的不应该定义新的Dispose(),因为它确实会导致资源泄漏(如果它不”请致电base.Dispose()
)。
相反,你可以使用另一个类:
public class MyClassWrapper : IDisposable
{
MyPoolManager manager = null;
MyClass myClass = null;
public MyClassWrapper(MyPoolManager manager, MyClass myClass)
{
this.manager = manager;
this.myClass = myClass;
}
public void Dispose()
{
manager.ReturnPooledConnection(this.myClass);
}
public MyClass GetMyClass()
{
return this.myClass;
}
}
Here是SO一个伟大的职位有关实现IDisposable的
我们在谈论什么类型的连接,约在这里? – 2012-03-31 23:41:31
+1 @MaciejDopieralski这是一个很好的问题,因为.NET已经有了一个数据库连接池机制... – surfen 2012-03-31 23:48:00
一个tcp-ip连接对远程服务器开放。 – newbie 2012-03-31 23:50:44