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;
}