private T WaitForResource() { DateTime future = DateTime.Now.AddMilliseconds(WaitTime); do { PooledObjectStatus <T> returnObject = null; lock (FreeStack) { if (!(FreeStack.Count == 0) && !FreeStack.Peek().Used) { returnObject = FreeStack.Pop(); returnObject.Used = true; UseStack.Add(returnObject); Console.WriteLine("Provisioning Object > " + returnObject.Uuid.ToString()); return(returnObject.PooledObject); } } if (returnObject == null || returnObject.Used) { long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds(); if (WaitTime != 0 && milliseconds >= future.Millisecond) { throw new PoolException("Tiempo de espera agotado"); } try { Thread.Sleep(1000); } catch (Exception e) { Console.WriteLine(e.ToString()); } } } while (true); }
private T GetInternalObject() { lock (FreeStack) { if (!(FreeStack.Count == 0)) { PooledObjectStatus <T> first = this.FreeStack.Pop(); first.Used = true; Console.WriteLine("Provisioning Object > " + first.Uuid.ToString()); UseStack.Add(first); return(first.PooledObject); } lock (FullStack) { if (FullStack.Count < MaxInstances) { PooledObjectStatus <T> returnObject = CreateNewPooledObject(); returnObject.Used = true; Console.WriteLine("Provisioning Object > " + returnObject.Uuid.ToString()); UseStack.Add(returnObject); return(returnObject.PooledObject); } else { return(default(T)); } } } }
private void InitPool() { for (int c = FullStack.Count; c < MinInstances; c++) { PooledObjectStatus <T> createNewPooledObject = CreateNewPooledObject(); FreeStack.Push(createNewPooledObject); } }
private PooledObjectStatus <T> CreateNewPooledObject() { T newObject = PoolableObjectFactory.CreateNew(); PooledObjectStatus <T> pooled = new PooledObjectStatus <T>(newObject); FullStack.Add(pooled); Console.WriteLine("New PoolableObject{UUID=" + pooled.Uuid.ToString() + ", poolSize=" + FullStack.Count + "}"); return(pooled); }