2012-03-31 60 views
1

我试图实现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 
+3

我们在谈论什么类型的连接,约在这里? – 2012-03-31 23:41:31

+1

+1 @MaciejDopieralski这是一个很好的问题,因为.NET已经有了一个数据库连接池机制... – surfen 2012-03-31 23:48:00

+0

一个tcp-ip连接对远程服务器开放。 – newbie 2012-03-31 23:50:44

回答

-1

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的

+1

'超'在c#中?超。 – 2012-03-31 23:49:55

+0

谢谢,我修好了 – surfen 2012-03-31 23:51:42

+0

如果我打电话base.Dispose()那么它不会被处置?我只想让对象返回到池中,我将再次使用它。 – newbie 2012-03-31 23:58:32