Advertisement
Guest User

LimitedPool<T>

a guest
Oct 26th, 2016
7,384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.81 KB | None | 0 0
  1. public class LimitedPool<T> : IDisposable where T : class
  2. {
  3.     readonly Func<T> _valueFactory;
  4.     readonly Action<T> _valueDisposeAction;
  5.     readonly TimeSpan _valueLifetime;
  6.     readonly ConcurrentStack<LimitedPoolItem<T>> _pool;
  7.     bool _disposed;
  8.  
  9.     public LimitedPool(Func<T> valueFactory, Action<T> valueDisposeAction, TimeSpan? valueLifetime = null)
  10.     {
  11.         _valueFactory = valueFactory;
  12.         _valueDisposeAction = valueDisposeAction;
  13.         _valueLifetime = valueLifetime ?? TimeSpan.FromHours(1);
  14.         _pool = new ConcurrentStack<LimitedPoolItem<T>>();
  15.     }
  16.  
  17.     public int IdleCount => _pool.Count;
  18.  
  19.     public LimitedPoolItem<T> Get()
  20.     {
  21.         LimitedPoolItem<T> item;
  22.         // try to get live cached item
  23.         while (!_disposed && _pool.TryPop(out item))
  24.         {
  25.             if (!item.Expired)
  26.                 return item;
  27.             // dispose expired item
  28.             item.Dispose();
  29.         }
  30.         // since no cached items available we create a new one
  31.         return new LimitedPoolItem<T>(_valueFactory(), disposedItem =>
  32.         {
  33.             if (disposedItem.Expired)
  34.             {
  35.                 // item has been expired, dispose it forever
  36.                 _valueDisposeAction(disposedItem.Value);
  37.             }
  38.             else
  39.             {
  40.                 // item is still fresh enough, return it to the pool
  41.                 if (!_disposed)
  42.                     _pool.Push(disposedItem);
  43.             }
  44.         }, _valueLifetime);
  45.     }
  46.  
  47.     public void Dispose()
  48.     {
  49.         Dispose(true);
  50.         GC.SuppressFinalize(this);
  51.     }
  52.  
  53.     void Dispose(bool disposing)
  54.     {
  55.         if (disposing)
  56.         {
  57.             _disposed = true;
  58.             var items = _pool.ToArray();
  59.             foreach (var item in items)
  60.                 _valueDisposeAction(item.Value);
  61.         }
  62.     }
  63. }
  64.  
  65. public class LimitedPoolItem<T> : IDisposable
  66. {
  67.     readonly Action<LimitedPoolItem<T>> _disposeAction;
  68.  
  69.     readonly TimeSpan _lifetime;
  70.     bool _expired;
  71.  
  72.     public T Value { get; }
  73.  
  74.     internal bool Expired
  75.     {
  76.         get
  77.         {
  78.             if (_expired)
  79.                 return true;
  80.             _expired = _stopwatch.Elapsed > _lifetime;
  81.             return _expired;
  82.         }
  83.     }
  84.     readonly Stopwatch _stopwatch;
  85.  
  86.     internal LimitedPoolItem(T value, Action<LimitedPoolItem<T>> disposeAction, TimeSpan lifetime)
  87.     {
  88.         _disposeAction = disposeAction;
  89.         _lifetime = lifetime;
  90.         Value = value;
  91.         _stopwatch = new Stopwatch();
  92.         _stopwatch.Start();
  93.     }
  94.  
  95.     public void Dispose()
  96.     {
  97.         Dispose(true);
  98.         GC.SuppressFinalize(this);
  99.     }
  100.  
  101.     void Dispose(bool disposing)
  102.     {
  103.         if (disposing)
  104.         {
  105.             _disposeAction(this);
  106.         }
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement