Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 3
0
        public void Return(IDotNettyConnection connection)
        {
            _connectionQueue.Enqueue(connection);
            _waitEvent.Release();

            Interlocked.Exchange(ref _lastTicks, DateTime.UtcNow.Ticks);
        }