private void ReceiveCallback(IAsyncResult ar)
        {
            var    state     = (StateObject)ar.AsyncState;
            Socket handler   = state.WorkSocket;
            int    bytesRead = 0;

            try
            {
                bytesRead = handler.EndReceive(ar);
            }
            catch (Exception e)
            {
                server.CheckIfClientDisconnected(handler);
                return;
            }

            if (bytesRead > 2)
            {
                try
                {
                    foreach (var message in MessageSerializer.UnwrapMessages(state.Buffer, bytesRead))
                    {
                        var receivedMessage = new ReceivedMessage(handler, message);

                        server.AddMessage(receivedMessage);
                    }
                }
                catch (ArgumentOutOfRangeException e)
                {
                    logger.Warn("[NetworkComponent] {message}", e.Message);
                }
                state.SetReceiveCallback(new AsyncCallback(ReceiveCallback));
            }
            else if (bytesRead > 0)
            {
                logger.Warn("[NetworkComponent] Received message was too short (expected more than 2 bytes)");
                state.SetReceiveCallback(new AsyncCallback(ReceiveCallback));
            }
            else if (!server.CheckIfClientDisconnected(handler))
            {
                state.SetReceiveCallback(new AsyncCallback(ReceiveCallback));
            }
        }
 // Call this method from other threads
 internal void AddMessage(ReceivedMessage receivedMessage)
 {
     messageQueue.Enqueue(receivedMessage);
     shouldProcessMessage.Set();
 }