我試圖實現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
我們在談論什麼類型的連接,約在這裏? – 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