internal OpenConnection GetOrCreateClient(SocksAddress address, bool useSsl, DateTime now)
        {
            lock (_connectionPool)
            {
                var            key = new OpenConnectionKey(address, useSsl);
                OpenConnection info;
                if (_connectionPool.TryGetValue(key, out info))
                {
                    if (!info.DisposeIfInvalid(now))
                    {
#if SUPPORTS_NLOG
                        _logger.Debug("Pool: Reuse client");
#endif
                        return(info);
                    }
#if SUPPORTS_NLOG
                    _logger.Debug("Dispose client");
#endif
                    _connectionPool.Remove(key);
                    info.Client.Dispose();
                }
#if SUPPORTS_NLOG
                _logger.Debug("Pool: Create client (2): {0}", address);
#endif
                info = new OpenConnection(address, Factory.Create(address, useSsl));
                _connectionPool.Add(key, info);
                return(info);
            }
        }
        internal OpenConnection Create(SocksAddress address, bool useSsl)
        {
            var key    = new OpenConnectionKey(address, useSsl);
            var client = Factory.Create(address, useSsl);

            lock (_connectionPool)
            {
                OpenConnection oldInfo;
                if (_connectionPool.TryGetValue(key, out oldInfo))
                {
                    _connectionPool.Remove(key);
                    oldInfo.Client.Dispose();
                }
                var result = new OpenConnection(address, client);
                _connectionPool.Add(key, result);
#if SUPPORTS_NLOG
                _logger.Debug("Pool: Create client (1): {0}", address);
#endif
                return(result);
            }
        }