private void ListenerThread()
        {
            _receivingUdpClient.ExclusiveAddressUse = false;
            _receivingUdpClient.Connect(new IPEndPoint(IPAddress.None, ClientPort));

            while (true)
            {
                try
                {
                    IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, ClientPort);
                    // Blocks until a message returns on this socket from a remote host.
                    Byte[] receiveBytes = _receivingUdpClient.Receive(ref remoteIpEndPoint);

                    if (receiveBytes.Length == 0)
                    {
                        return;
                    }

                    NetCommand cmd    = NetCommand.Parse(receiveBytes);
                    IPAddress  sender = remoteIpEndPoint.Address;

                    lock (_incomingQueue)
                    {
                        _incomingQueue.Push(new NetPackage()
                        {
                            NetCommand = cmd, Sender = sender
                        });
                        Debug.WriteLine($"Queue count: {_incomingQueue.Count}");
                    }

                    Debug.WriteLine("Network data received!");
                    if (NetworkEvent != null)
                    {
                        Debug.WriteLine("Invoking event handlers: " + NetworkEvent.GetInvocationList().Length);
                    }
                    else
                    {
                        Debug.WriteLine($"No event handlers attached! Read from queue manually");
                    }

                    NetworkEvent?.Invoke(cmd, sender);
                }
                catch (SocketException e)
                {
                    Debug.WriteLine(e);
                    throw;
                }
            }
        }