public object BorrowObject() { lock (sync) { if (closed) { throw new InvalidOperationException("The pool is closed."); } object useable = null; IEnumerator <object> objects = passiveObjects.GetEnumerator(); List <object> destroyedObjects = new List <object>(); while (objects.MoveNext() && useable == null) { PoolableObjectFactory.ActivateObject(objects.Current); if (PoolableObjectFactory.ValidateObject(objects.Current)) { useable = objects.Current; } else { PoolableObjectFactory.DestroyObject(objects.Current); destroyedObjects.Add(objects.Current); } } passiveObjects.RemoveAll(o => destroyedObjects.Contains(o)); if (useable == null) { useable = PoolableObjectFactory.MakeObject(); PoolableObjectFactory.ActivateObject(useable); } activeObjects.Add(useable); return(useable); } }
private void Destroy(PooledObject <T> target) { target.Invalidate(); idleObjects.Remove(target); allObjects.Remove(target.TheObject); try { factory.DestroyObject(target.TheObject); } finally { Interlocked.Decrement(ref createCount); } }