public T CheckOut() { long now = DateTime.Now.Ticks; T obj = null; if (Unlocked.Count > 0) { foreach (var keyval in Unlocked) { obj = keyval.Key; if (now - keyval.Value > ExpirationTime) { Unlocked.Remove(obj); Expire(obj); obj = null; } else { if (Validate(obj)) { Unlocked.Remove(obj); Locked.Add(obj, now); return(obj); } else { Unlocked.Remove(obj); Expire(obj); obj = null; } } } } obj = Create(); Locked.Add(obj, now); return(obj); }