/// <summary> /// Recover abandoned objects which have been checked out but /// not used since longer than the removeAbandonedTimeout. /// </summary> /// <param name="ac"></param> private void RemoveAbandoned(AbandonedConfig ac) { long now = DateTime.Now.CurrentTimeMillis(); long timeout = now - ac.getRemoveAbandonedTimeout() * 1000L; List <IPooledObject <T> > remove = new List <IPooledObject <T> >(); IEnumerator <IPooledObject <T> > it = _allObjects.Values.GetEnumerator(); do { IPooledObject <T> pooledObject = it.Current; lock (pooledObject) { if (pooledObject.GetState() == PooledObjectState.Allocated && pooledObject.GetLastUsedTime() <= timeout) { pooledObject.MarkAbandoned(); remove.Add(pooledObject); } } } while (it.MoveNext()); // Now remove the abandoned objects IEnumerator <IPooledObject <T> > itr = remove.GetEnumerator(); do { IPooledObject <T> pooledObject = itr.Current; try { InvalidateObject(pooledObject.GetObject()); } catch (Exception ex) { throw ex; } } while (itr.MoveNext()); }