asp.net-core - 在 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;
}
}
解决方案
推荐阅读
- css - 你如何在反应中 mpa 一个 json const 并设置它的样式?
- python - pip install mysql-python 失败,缺少 config-win.h
- stenciljs - 如何在 StencilJS 中使用 getter/setter 处理 @Prop() 逻辑
- c++ - 如何改进以下 lambda 函数以查找向量中的前 4 个元素
- asp.net - ChangePassword 控件忽略自定义模板并呈现默认值
- pandas - 如何从熊猫“编码”数据框的列
- excel - VBA 在 Excel 中创建带有表格和签名的电子邮件
- python - 如何使用参数获取和设置属性
- localization - Is it a good idea to cascade localization translation files?
- azure - Coexistence between Azure P2S VPN and Expressroute