首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 資源池實現 - 線程安全的通用物件池模式

     編輯:關於C語言

設計目標

提供通用、線程安全的資源池(如資料庫連線、Socket 連線),支援取得/歸還資源、最大資源數限制、單例模式存取。

核心類別結構

  • ResourcePool<T> : IDisposable where T : class, IDisposable:主池類別,泛型約束資源需可釋放。
  • ResourceTag<T>:內部標記類別,包裝資源實例與 InUse 狀態。
  • IResourceProvider<T>:資源建立/銷毀介面,解耦具體資源類型。

關鍵機制

單例模式 (Double-Check Locking)

static object key3 = new object();
public static ResourcePool<T> Instance(IResourceProvider<T> provider, int maxResource) {
    if (pool == null) {
        lock (key3) {
            if (pool == null) pool = new ResourcePool<T>(provider, maxResource);
        }
    }
    return pool;
}

取得資源 GetResource

  1. 嘗試從字典尋找 !InUse 的資源,找到標記 InUse=true 返回。
  2. 若無可用且未達上限,呼叫 provider.Request() 建立新資源,包裝 ResourceTag 加入字典。
  3. 若達上限或建立失敗,返回 null 並輸出 resourceID = -1。

歸還資源 ReturnResource

  1. 驗證 resourceID 合法性。
  2. 標記 InUse=false,移除舊 ID(防止重複使用)。
  3. 若當前資源數 ≥ 上限,將歸還資源標記為 toDispose 稍後銷毀;否則重新產生新 ID 放回池中。
  4. 將呼叫端參考設為 null,防止外部繼續使用。

釋放機制 Dispose Pattern

  • Dispose() 呼叫 Dispose(true),釋放所有資源並清理鎖物件。
  • 終結子 ~ResourcePool() 呼叫 Dispose(false),僅釋放資源不清理鎖。

程式碼亮點

  • 使用 Dictionary<long, ResourceTag<T>> 管理資源,Key 以 DateTime.Now.Ticks 產生。
  • 三把獨立鎖 (key1, key2, key3) 分離取得、歸還、單例建立的臨界區,降低爭用。
  • ref T resource 參數確保歸還後呼叫端參考失效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved