protected async Task DoRentAsync(int rentCount) { var uri = new Uri("http://www.baidu.com"); //var random = new Random(); foreach (var connectionPool in _connectionPools.Values) { var sw = Stopwatch.StartNew(); var tasks = Enumerable.Range(0, rentCount).Select(async m => { IDotNettyConnection connection = null; try { connection = await connectionPool.WaitForIdleConnection(uri, null, CancellationToken.None).ConfigureAwait(false); //await Task.Delay(random.Next(1, 10)).ConfigureAwait(false); await Task.Delay(10).ConfigureAwait(false); } finally { connectionPool.Return(connection); } }).ToArray(); await Task.WhenAll(tasks).ConfigureAwait(false); sw.Stop(); Console.WriteLine($"MaxCount:{connectionPool.MaxCount} Count:{connectionPool.Count} RentCount:{rentCount} Time:{sw.Elapsed}"); Assert.AreEqual(connectionPool.Count, connectionPool.MaxCount); } }
internal async Task <IFullHttpResponse> InternalExecuteAsync(IFullHttpRequest request, Uri targetUri, Uri proxyUri, CancellationToken token) { if (!request.Headers.Contains(HttpHeaderNames.Host)) { request.Headers.Add(HttpHeaderNames.Host, $"{targetUri.Host}:{targetUri.Port}"); } int targetHash = GetTargetHashCode(targetUri, proxyUri); var connectionPool = await GetConnectionQueueAsync(targetHash).ConfigureAwait(false); IDotNettyConnection connection = null; try { #pragma warning disable CA2000 // 丢失范围之前释放对象 connection = await connectionPool.WaitForIdleConnection(targetUri, proxyUri, token).ConfigureAwait(false); #pragma warning restore CA2000 // 丢失范围之前释放对象 return(await connection.ExecuteAsync(request, token).ConfigureAwait(false)); } finally { if (connection != null) { connectionPool.Return(connection); } } }
public void Return(IDotNettyConnection connection) { _connectionQueue.Enqueue(connection); _waitEvent.Release(); Interlocked.Exchange(ref _lastTicks, DateTime.UtcNow.Ticks); }