public void Enqueue(ClientEntry entry) { if (_disposedValue) { throw new ObjectDisposedException(nameof(ClientPool)); } if (entry == null) { throw new ArgumentNullException(nameof(entry)); } if (!entry.Client.Client.RemoteEndPoint.Equals(_endpoint)) { throw new ArgumentException("Invalid endpoint."); } // TickCount swap will be fine here as the entry just gets disposed and we'll create a new one starting at 0+ again, totall fine... if (_enablePool && entry.Client.Connected && entry.StartMillis + entry.MaxLiveTime >= (Environment.TickCount & int.MaxValue)) { _clients.Enqueue(entry); } else { // dispose the client and don't keep a reference entry.DisposeClient(); } }
private bool TryDequeue(out ClientEntry entry) { if (_disposedValue) { throw new ObjectDisposedException(nameof(ClientPool)); } bool result; // ReSharper disable once AssignmentInConditionalExpression while (result = _clients.TryDequeue(out entry)) { // validate the client before returning it if (entry.Client.Connected && entry.StartMillis + entry.MaxLiveTime >= (Environment.TickCount & int.MaxValue)) { break; } entry.DisposeClient(); } return(result); }
public bool TryDequeue(out ClientEntry entry) { if (disposedValue) { throw new ObjectDisposedException(nameof(ClientPool)); } bool result; while (result = _clients.TryDequeue(out entry)) { // validate the client before returning it if (entry.Client.Connected && entry.StartMillis + entry.MaxLiveTime >= (Environment.TickCount & int.MaxValue)) { break; } else { entry.DisposeClient(); } } return(result); }