private async Task StartReceiving(ClientStateObject state)
        {
            if (_isDisposed) return;
            if (!_socket.Connected) return;

            _logger.Info("Receiving message...");
            try
            {
                var args = new SocketAsyncEventArgs();
                args.SetBuffer(new byte[0x1000], 0, 0x1000);
                var awaitable = new SocketAwaitable(args);

                while (true)
                {
                    await _socket.ReceiveAsync(awaitable);
                    var bytesRead = args.BytesTransferred;
                    if (bytesRead <= 0) break;

                    _logger.Info(string.Format("Bytes Read: {0}", bytesRead));
                    if (awaitable.EventArgs.Buffer[0] == _framingProtocol.StartFrame || state.StartedReceiving)
                    {
                        state.Append(Encoding.ASCII.GetString(awaitable.EventArgs.Buffer, 0, bytesRead));
                    }

                    if (awaitable.EventArgs.Buffer[bytesRead - 1] == _framingProtocol.EndFrame) // We're done
                    {
                        InvokeMessageReceived(_framingProtocol.UnframeMessage(state.ToString()));
                    }
                }
            }
            catch (SocketException e)
            {
                if (e.SocketErrorCode != SocketError.ConnectionAborted) throw;
                // reconnect and send again
                _socket.Close();
                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                Send(state.OutboundMessage);
            }
        }