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