From 616be1acebd800d753ee4436f66c77147c2064e7 Mon Sep 17 00:00:00 2001 From: Alessio Parma Date: Fri, 7 Apr 2017 22:34:03 +0200 Subject: [PATCH] timed object pool is ok --- .../Core/PooledObjectBuffer.cs | 3 +-- .../ITimedObjectPool.cs | 7 +++++++ src/CodeProject.ObjectPool/ObjectPool.cs | 2 +- src/CodeProject.ObjectPool/TimedObjectPool.cs | 19 ++++++++++++++++++- .../Program.cs | 15 +++++++++++++++ 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/CodeProject.ObjectPool/Core/PooledObjectBuffer.cs b/src/CodeProject.ObjectPool/Core/PooledObjectBuffer.cs index 7292475..d3b726d 100644 --- a/src/CodeProject.ObjectPool/Core/PooledObjectBuffer.cs +++ b/src/CodeProject.ObjectPool/Core/PooledObjectBuffer.cs @@ -83,9 +83,8 @@ public int Count /// An enumerator that can be used to iterate through the collection. public IEnumerator GetEnumerator() { - for (var i = 0; i <= _pooledObjects.Length; ++i) + foreach (var item in _pooledObjects) { - var item = _pooledObjects[i]; if (item != null) { yield return item; diff --git a/src/CodeProject.ObjectPool/ITimedObjectPool.cs b/src/CodeProject.ObjectPool/ITimedObjectPool.cs index 08605a8..0ac5668 100644 --- a/src/CodeProject.ObjectPool/ITimedObjectPool.cs +++ b/src/CodeProject.ObjectPool/ITimedObjectPool.cs @@ -21,6 +21,8 @@ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT // OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +using System; + namespace CodeProject.ObjectPool { /// @@ -38,5 +40,10 @@ public interface ITimedObjectPool : IObjectPool #endif where T : PooledObject { + /// + /// When pooled objects have not been used for a time greater than , + /// then they will be destroyed by a cleaning task. + /// + TimeSpan Timeout { get; set; } } } \ No newline at end of file diff --git a/src/CodeProject.ObjectPool/ObjectPool.cs b/src/CodeProject.ObjectPool/ObjectPool.cs index bbbab1b..96b6050 100644 --- a/src/CodeProject.ObjectPool/ObjectPool.cs +++ b/src/CodeProject.ObjectPool/ObjectPool.cs @@ -260,7 +260,7 @@ void IObjectPoolHandle.ReturnObjectToPool(PooledObject objectToReturnToPool, boo /// Creates a new pooled object, initializing its info. /// /// A new pooled object. - protected T CreatePooledObject() + protected virtual T CreatePooledObject() { if (Diagnostics.Enabled) { diff --git a/src/CodeProject.ObjectPool/TimedObjectPool.cs b/src/CodeProject.ObjectPool/TimedObjectPool.cs index c0087a1..70b944c 100644 --- a/src/CodeProject.ObjectPool/TimedObjectPool.cs +++ b/src/CodeProject.ObjectPool/TimedObjectPool.cs @@ -38,7 +38,7 @@ namespace CodeProject.ObjectPool /// The type of the object that which will be managed by the pool. The pooled object have to be /// a sub-class of PooledObject. /// - internal class TimedObjectPool : ObjectPool, ITimedObjectPool + public class TimedObjectPool : ObjectPool, ITimedObjectPool where T : PooledObject { #region Fields @@ -137,6 +137,23 @@ public TimeSpan Timeout #region Core Methods + /// + /// Creates a new pooled object, initializing its info. + /// + /// A new pooled object. + protected override T CreatePooledObject() + { + var pooledObject = base.CreatePooledObject(); + + // Register an handler which records the time at which the object returned to the pool. + pooledObject.OnResetState += () => + { + pooledObject.PooledObjectInfo.Payload = DateTime.UtcNow; + }; + + return pooledObject; + } + /// /// Updates the timer according to a new timeout. /// diff --git a/test/CodeProject.ObjectPool.Examples/Program.cs b/test/CodeProject.ObjectPool.Examples/Program.cs index 3a3f247..9f50dc5 100644 --- a/test/CodeProject.ObjectPool.Examples/Program.cs +++ b/test/CodeProject.ObjectPool.Examples/Program.cs @@ -22,6 +22,7 @@ // OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. using System; +using System.Threading; namespace CodeProject.ObjectPool.Examples { @@ -60,6 +61,20 @@ private static void Main() wrapper.InternalResource.DoOtherStuff(); } // Exiting the using scope will return the object back to the pool. + // Creates a pool where objects which have not been used for over 2 seconds will be + // cleaned up by a dedicated thread. + var timedPool = new TimedObjectPool(TimeSpan.FromSeconds(2)); + + using (var resource = timedPool.GetObject()) + { + // Using the resource... + resource.DoStuff(); + } // Exiting the using scope will return the object back to the pool and record last usage. + + Console.WriteLine($"Timed pool size after 0 seconds: {timedPool.ObjectsInPoolCount}"); // Should be 1 + Thread.Sleep(TimeSpan.FromSeconds(4)); + Console.WriteLine($"Timed pool size after 4 seconds: {timedPool.ObjectsInPoolCount}"); // Should be 0 + Console.Read(); }