2012-03-31 85 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