private async Task ConnectTask(string ipAddress, string port, string username) { var ip = IPAddress.Parse(ipAddress); var intPort = int.Parse(port); var ipEndpoint = new IPEndPoint(ip, intPort); var client = new TcpClient(); client.Connect(ipEndpoint); var stream = client.GetStream(); // for testing purposes send over join chat room message var msg = new JoinChatroomMessage() { Username = username }; lock (_queueService.QueueLock) { _queueService.Enqueue(msg); } var socket = client.Client; while (!(socket.Poll(0, SelectMode.SelectRead) && socket.Available == 0)) { if (stream.DataAvailable) { int twoKiloBytes = 2048; byte[] buffer = new byte[twoKiloBytes]; int messageLength = await stream.ReadAsync(buffer, 0, twoKiloBytes); var flushTask = stream.FlushAsync(); byte[] actualMessage = buffer.Take(messageLength).ToArray(); await Task.Run(() => _messageHandlingService.HandleMessage(actualMessage, socket)); await flushTask; } if (_queueService.ItemAvailable) { // Message to send IMessage message; lock (_queueService.QueueLock) { message = _queueService.Dequeue(); } var bytes = message.Pack(); await stream.WriteAsync(bytes, 0, bytes.Length); await stream.FlushAsync(); } } _eventAggregator.GetEvent <KillHeartbeatEvent>().Publish(); client.Close(); }