Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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();
            }
        }
Esempio n. 4
0
 public void Checkin(LockedHttpClient client)
 {
     client.Locked = false;
 }