处理SignalR.Core中的并发请求

时间:2020-04-12 23:21:15

标签: asp.net-core concurrency signalr asp.net-core-signalr

我正在开发游戏,并使用SignalR.Core版本3.1.0.0进行实时活动。我的问题是处理对同一个无效对象的并发请求。在一个空白中,我有一个条件,即该条件影响游戏时段。当第一人称参与游戏时,检查是否不存在准备参加游戏的玩家必须将此人状态设置为准备参加游戏。但是在我的代码中,当两个人同时(具有不同的用户实体和不同的纳秒时间戳)加入游戏时,两个人都准备就绪。而无需注意我的代码条件!

我的假设是当两个人请求玩游戏时,肯定一个人比另一个人请求得早,因此我在下一个人的请求到达之前在availablePlayers列表中有一个人。我的假设错了吗? / p>

我的代码:

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

0 个答案:

没有答案
相关问题