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);
} 多線程
這是一個比較典型的對象池接口: asp.net
因爲抽象類ObjectPool沒法直接使用,雖然接口實現並不複雜,但實現起來仍是要花一番功夫的。所以,該庫也還提供了一個默認實現DefaultObjectPool,以下就是一個簡單的示例: ide
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 int Value { get; set; } }
DefaultObjectPool是一個默認的實現,它是線程安全的,咱們能夠放心在多線程環境下使用。它有兩個輸入參數:對象池策略IPooledObjectPolicy和線程池容量。函數
對象池策略IPooledObjectPolicy接口定義以下: spa
public interface IPooledObjectPolicy<T> { T Create(); bool Return(T obj); }
它聲明瞭對象的建立和釋放的行爲。接口看起來和線程池的接口很是類似,這樣設計的好處有:.net
系統默認也有一個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來實現本身的線程池。設計