Обработка одновременного запроса в SignalR.Core - PullRequest
0 голосов
/ 13 апреля 2020

Я занимаюсь разработкой игры и использую SignalR.Core версии 3.1.0.0 для событий в реальном времени. Моя проблема, связанная с обработкой одновременного запроса на ту же пустоту. в одной пустоте у меня есть условие, что это условие влияет на игровые сессии. когда первый человек присоединяется к игре, проверяется, не существует ли он, готовые к игре игроки должны установить для этого состояния состояние готовности к игре. но в моем коде, когда два человека присоединяются к игре в одно и то же время (с другой сущностью пользователя и другой нано второй меткой времени), оба человека к игре готовятся. Без внимания к моему состоянию кода !!

мое предположение - когда два человек запросил сыграть в игру, конечно, один человек просил раньше, чем другой человек, поэтому у меня есть один человек в списке availablePlayers до поступления запроса следующего человека. неверно мое предположение ??

мой код:

 public async Task<bool> Play(int userID, int level)
    {
        try
        {
            //get user data from subscribed users in GameHub
            var player = signalrClients.FirstOrDefault(x => x.ID == userID);
            if (player == null) return false;

            //get list persons that want to play game
            var availablePlayers = signalrClients.Where(x => x.WantedLevel == level &&
            x.IsWaitingForOpponent == true &&
            x.IsPlaying == false &&
            x.ID != userID).ToList();

            //problem is here, because two request arrive in same time availablePlayers count is zero
            //and dont create any gameSession
            if (availablePlayers.Count > 0)
            {
                #region create game session
                Game newSession = new Game()
                {
                    Token = Guid.NewGuid(),
                    Level = level,
                    GameType = GameType.StrangerGame,
                    ListPlayer = new List<PlayerModel>()
                };

                #endregion
                await LogGameSessionList(gameSession);
            }
            else
            {
                player.IsWaitingForOpponent = true;
                player.WantedLevel = level;

            }
            return true;

        }
        catch (Exception ex)
        {
            return false;
        }
    }
...