首页 > 解决方案 > 在 SignalR.Core 中处理并发请求

问题描述

我正在开发一个游戏并使用 SignalR.Core 版本 3.1.0.0 进行实时事件。我的问题是关于处理对同一 void 的并发请求。在一个空白中,我有一个条件,这个条件会影响游戏会话。当第一个人加入玩游戏时,检查是否存在准备好游戏的玩家必须将此人状态设置为准备玩游戏。但是在我的代码中,当两个人同时加入游戏(具有不同的用户实体和不同的纳秒时间戳)时,两个人都准备好了。不注意我的代码条件!

我的假设是当两个人要求玩游戏时,肯定一个人要求比另一个人早,所以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;
        }
    }

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

解决方案


推荐阅读