protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            await sync.SemaphoreSlim.WaitAsync();

            logger.Information("Started CommunicationService");
            gmClient = container.GMClient;

            while (!stoppingToken.IsCancellationRequested)
            {
                Message message = await queue.ReceiveAsync(stoppingToken);

                if (message == null)
                {
                    logger.Information("Stopping CommunicationService");
                    return;
                }

                if (message.IsMessageToGM())
                {
                    await gmClient.SendAsync(message, stoppingToken);

                    logger.Verbose(MessageLogger.Received(message) + ". Sent message to GM");
                }
                else
                {
                    await manager.SendMessageAsync(message.AgentID.Value, message, stoppingToken);

                    logger.Verbose(MessageLogger.Received(message) + ". Sent message to Player");
                    await sync.SemaphoreSlim.WaitAsync();

                    if (!container.GameStarted)
                    {
                        if (message.MessageID == MessageID.JoinTheGameAnswer)
                        {
                            JoinAnswerPayload payload = (JoinAnswerPayload)message.Payload;
                            if (payload.Accepted)
                            {
                                ConfirmSocket(message);
                            }
                        }
                        else if (message.MessageID == MessageID.StartGame)
                        {
                            await CloseUnconfirmedSockets(stoppingToken);

                            container.GameStarted = true;
                        }
                    }
                    sync.SemaphoreSlim.Release(1);
                }
            }
        }