提供通用、線程安全的資源池(如資料庫連線、Socket 連線),支援取得/歸還資源、最大資源數限制、單例模式存取。
ResourcePool<T> : IDisposable where T : class, IDisposable:主池類別,泛型約束資源需可釋放。ResourceTag<T>:內部標記類別,包裝資源實例與 InUse 狀態。IResourceProvider<T>:資源建立/銷毀介面,解耦具體資源類型。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;
}
!InUse 的資源,找到標記 InUse=true 返回。provider.Request() 建立新資源,包裝 ResourceTag 加入字典。null 並輸出 resourceID = -1。resourceID 合法性。InUse=false,移除舊 ID(防止重複使用)。toDispose 稍後銷毀;否則重新產生新 ID 放回池中。null,防止外部繼續使用。Dispose() 呼叫 Dispose(true),釋放所有資源並清理鎖物件。~ResourcePool() 呼叫 Dispose(false),僅釋放資源不清理鎖。Dictionary<long, ResourceTag<T>> 管理資源,Key 以 DateTime.Now.Ticks 產生。key1, key2, key3) 分離取得、歸還、單例建立的臨界區,降低爭用。ref T resource 參數確保歸還後呼叫端參考失效。