private void RunSender() { if (!active) { return; } if (shouldClose) { CleanNetworking(); return; } if (pendingMessagesQueue.Count == 0) { return; } MessageEntry entry = pendingMessagesQueue.Dequeue(); IMessage message = entry.Message; Action <bool> listener = entry.Listener; MemoryStream output = new MemoryStream(); NetworkBinaryWriter writer = new NetworkBinaryWriter(output); int messageTypeId = message.Type.TypeId; int contentSize = message.Content.Length; byte[] content = message.Content; writer.WriteInt(messageTypeId); writer.WriteInt(contentSize); writer.WriteBytes(content); byte[] messageTypeIdArray = BitConverter.GetBytes(messageTypeId); byte[] messageContentSizeArray = BitConverter.GetBytes(message.Content.Length); byte[] messageBytes = output.ToArray(); output.Close(); SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs(); socketEventArgs.RemoteEndPoint = socket.RemoteEndPoint; socketEventArgs.UserToken = null; SendListener sendListener = new SendListener(listener); socketEventArgs.Completed += sendListener.OnSendCompleted; socketEventArgs.Completed += OnMessageSendCompleted; socketEventArgs.SetBuffer(messageBytes, 0, messageBytes.Length); socket.SendAsync(socketEventArgs); }