Beispiel #1
0
 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);
            }
        }