public ConnectionIO(Connection connection) : base(channelNum: 0)
		{
			_cancellationTokenSource = new CancellationTokenSource();
			_cancellationToken = _cancellationTokenSource.Token;

			_conn = connection;
			_socketHolder = new SocketHolder(_cancellationTokenSource.Token);

			_commandOutboxEvent = new AutoResetEvent(false);
			// _commandOutboxEvent = new AutoResetSuperSlimLock(false);
			_commandOutbox = new ConcurrentQueue<CommandToSend>();

			_cmdToSendObjPool = new ObjectPool<CommandToSend>(() => new CommandToSend(i => _cmdToSendObjPool.PutObject(i)), 200, true);
		}
		public async Task<Connection> Connect(string hostname, 
			string vhost = "/", string username = "******", 
			string password = "******", int port = 5672)
		{
			var conn = new Connection();

			try
			{
				await conn.Connect(hostname, vhost, username, password, port);
			}
			catch (Exception)
			{
				conn.Dispose();
				throw;
			}
			
			return conn;
		}