/// <summary> /// Internal dispose, to be called from IDisposable override. /// </summary> /// <param name="disposing">If Dispose() is manually invoked.</param> protected virtual void Dispose(bool disposing) { if (!_disposed && disposing) { lock (LockObject) { if (Clients != null && Clients.Count > 0) { for (var i = 0; i < Clients.Count; i++) { T client; if (Clients.TryDequeue(out client)) { client.Dispose(); } } foreach (var key in ClientsInUse.Keys.ToList()) { T client; if (ClientsInUse.TryGetValue(key, out client) && ClientsInUse.TryRemove(key, out client)) { client.Dispose(); } } } } } _disposed = true; }
public virtual T GetPooledClient() { lock (LockObject) { T client; if (!Clients.TryDequeue(out client)) { return(null); } if (!ClientsInUse.TryAdd(client.GetHashCode(), client)) { throw new Exception("Unexpected error in GetClient(). Unable to track client."); } return(client); } }
public virtual bool AddPooledClient(T client) { if (client == null) { return(false); } lock (LockObject) { if (Count >= MaxClients || Clients.Any(p => p == client) || ClientsInUse.ContainsKey(client.GetHashCode())) { return(false); } Clients.Enqueue(new T()); return(true); } }
public virtual bool ReturnPooledClient(T client) { if (client == null) { return(false); } lock (LockObject) { if (!ClientsInUse.ContainsKey(client.GetHashCode())) { return(false); } T clientInUse; if (!ClientsInUse.TryRemove(client.GetHashCode(), out clientInUse)) { return(false); } Clients.Enqueue(clientInUse); return(true); } }