.net core中的物件池
asp.net core中通過擴充套件庫的方式提供給了一個標準的物件池ObjectPool,定義在Microsoft.Extensions.ObjectPool.dll 程式集中。它本身是個純虛的抽象類,它就定義了兩個介面函式,實現如下
public
abstract
class
ObjectPool
<
T
>
where
T
:
class
{
public
abstract
T
Get
();
public
abstract
void
Return
(
T
obj
);
}
這是一個比較典型的物件池介面:
-
Get函式用於從物件池獲取物件,如果物件池沒有可用物件,則會新建
-
Return函式用於物件使用完成後,將物件放回物件池,如果物件池容量已滿,則交由系統GC回收。
由於抽象類ObjectPool無法直接使用,雖然介面實現並不複雜,但實現起來還是要花一番功夫的。因此,該庫也還提供了一個預設實現DefaultObjectPool,如下就是一個簡單的示例:
public class Program { public static void Main(string[] args) { var policy = new DefaultPooledObjectPolicy<TestData>(); var pool= new DefaultObjectPool<TestData>(policy, 100); var obj = pool.Get(); pool.Return(obj); var obj2 = pool.Get(); Console.WriteLine(obj.Equals(obj2)); } } class TestData { public string Id{ get; set; } public string Name{ get; set; } public intValue { get; set; } }
DefaultObjectPool是一個預設的實現,它是執行緒安全的,我們可以放心在多執行緒環境下使用。它有兩個輸入引數:物件池策略IPooledObjectPolicy和執行緒池容量。
物件池策略IPooledObjectPolicy介面定義如下:
public interface IPooledObjectPolicy<T> { T Create(); bool Return(T obj); }
它聲明瞭物件的建立和釋放的行為。介面看起來和執行緒池的介面非常相似,這樣設計的好處有:
-
IPooledObjectPolicy負責物件建立和釋放這種多變的行為,更加靈活,容易擴充套件
-
IPooledObjectPolicy只需要考慮的建立和釋放即可,實現起來比較簡單。執行緒安全,物件管理、維護都交由DefaultObjectPool來維護即可。
系統預設也有一個IPooledObjectPolicy的實現DefaultPooledObjectPolicy,它的實現如下:
public class DefaultPooledObjectPolicy<T> : PooledObjectPolicy<T> where T : class, new() { public override T Create() { return new T(); } public override bool Return(T obj) { return true; } }
非常簡單,並且大多數的時候也夠用。當然,我們也可以根據需要實現自己的IPooledObjectPolicy。甚至也可以擴充套件DefaultObjectPool來實現自己的執行緒池。