comparison Implab/Components/DisposablePool.cs @ 153:b933ec88446e v2

docs
author cin
date Fri, 12 Feb 2016 00:59:29 +0300
parents 240aa6994018
children c52691faaf21
comparison
equal deleted inserted replaced
152:240aa6994018 153:b933ec88446e
2 using Implab.Parallels; 2 using Implab.Parallels;
3 using System.Threading; 3 using System.Threading;
4 using System.Diagnostics; 4 using System.Diagnostics;
5 using System.Diagnostics.CodeAnalysis; 5 using System.Diagnostics.CodeAnalysis;
6 6
7 namespace Implab { 7 namespace Implab.Components {
8 /// <summary>
9 /// The base class for implementing pools of disposable objects.
10 /// </summary>
11 /// <remarks>
12 /// <para>This class maintains a set of pre-created objects and which are frequently allocated and released
13 /// by clients. The pool maintains maximum number of unsued object, any object above this limit is disposed,
14 /// if the pool is empty it will create new objects on demand.</para>
15 /// <para>Instances of this class are thread-safe.</para>
16 /// </remarks>
8 public abstract class DisposablePool<T> : IDisposable { 17 public abstract class DisposablePool<T> : IDisposable {
9 readonly int m_size; 18 readonly int m_size;
10 readonly AsyncQueue<T> m_queue = new AsyncQueue<T>(); 19 readonly AsyncQueue<T> m_queue = new AsyncQueue<T>();
11 20
12 [SuppressMessage("Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes")] 21 [SuppressMessage("Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes")]
60 // изъят и освобожден произвольный элемен, что не повлияет на ход всего процесса. 69 // изъят и освобожден произвольный элемен, что не повлияет на ход всего процесса.
61 if (m_disposed && m_queue.TryDequeue(out instance) && instance is IDisposable) 70 if (m_disposed && m_queue.TryDequeue(out instance) && instance is IDisposable)
62 ((IDisposable)instance).Dispose() ; 71 ((IDisposable)instance).Dispose() ;
63 72
64 } else { 73 } else {
65 if (instance is IDisposable) 74 var disposable = instance as IDisposable;
66 ((IDisposable)instance).Dispose(); 75 if (disposable != null)
76 disposable.Dispose();
67 } 77 }
68 } 78 }
69 79
70 protected virtual void Dispose(bool disposing) { 80 protected virtual void Dispose(bool disposing) {
71 if (disposing) { 81 if (disposing) {
72 m_disposed = true; 82 m_disposed = true;
73 T instance; 83 T instance;
74 while (m_queue.TryDequeue(out instance)) 84 while (m_queue.TryDequeue(out instance)) {
75 if (instance is IDisposable) 85 var disposable = instance as IDisposable;
76 ((IDisposable)instance).Dispose(); 86 if (disposable != null)
87 disposable.Dispose();
88 }
77 } 89 }
78 } 90 }
79 91
80 #region IDisposable implementation 92 #region IDisposable implementation
81 93