public override Task<bool> ConnectAsync()
        {
            if (State != ChannelStateType.Closed)
                throw new InvalidOperationException("Should be closed to connect.");

            var tcs = _connectTcs = TaskFactory.Create<bool>();
            _logger?.Info("Connect.");

            SetState(ChannelStateType.Connecting);

            var connection = new TcpConnection(_packetSerializer, _logger);
            _tcpConnection = connection;
            _tcpConnection.Connected += OnConnect;
            _tcpConnection.Received += OnReceive;
            _tcpConnection.Closed += OnClose;
            _tcpConnection.Connect(_remoteEndPoint);

            return tcs.Task;
        }
        public override Task <bool> ConnectAsync()
        {
            if (State != ChannelStateType.Closed)
            {
                throw new InvalidOperationException("Should be closed to connect.");
            }

            var tcs = _connectTcs = TaskFactory.Create <bool>();

            _logger?.Info("Connect.");

            SetState(ChannelStateType.Connecting);

            var connection = new TcpConnection(_packetSerializer, _logger);

            _tcpConnection            = connection;
            _tcpConnection.Connected += OnConnect;
            _tcpConnection.Received  += OnReceive;
            _tcpConnection.Closed    += OnClose;
            _tcpConnection.Connect(_remoteEndPoint);

            return(tcs.Task);
        }