private LockedHttpClient CreateClient() { var client = new LockedHttpClient(); client.Timeout = TimeSpan.FromSeconds(Timeout); client.Locked = true; _Clients.Add(client); System.Diagnostics.Debug.WriteLine($"*** {GetType().Name}.{nameof(CheckOut)} - Created new HttpClient: {client.Id}"); return(client); }
private async Task <LockedHttpClient> GetUsedClientAsync() { LockedHttpClient client = null; while (client == null) { // get the first available client client = _Clients.FirstOrDefault(c => !c.Locked); if (client == null) { await Task.Delay(10); continue; } } return(client); }
public async Task <LockedHttpClient> CheckOut() { try { await _Mutex.WaitAsync(); LockedHttpClient client = null; if (_Clients.Count < PoolSize) { client = CreateClient(); } else { client = await GetUsedClientAsync(); if (client == null) { throw new Exception("Could not get a HttpClient."); } client.Locked = true; client.UseCount++; // client is stale - retire if (client.Refresh) { System.Diagnostics.Debug.WriteLine($"*** {GetType().Name}.{nameof(CheckOut)} - Client is state, refreshing: {client.Id}, used: {client.UseCount}"); _Clients.Remove(client); client.Dispose(); client = CreateClient(); } System.Diagnostics.Debug.WriteLine($"*** {GetType().Name}.{nameof(CheckOut)} - Checkout HttpClient: {client.Id}, used: {client.UseCount}"); } return(client); } finally { _Mutex.Release(); } }
public void Checkin(LockedHttpClient client) { client.Locked = false; }