您需要使用lock
,实际上有很多方法可以做到这一点使用lock
,正确的方法取决于许多建筑的问题。它可以在数据库级别,后端级别或简单地在前端(webAPI)级别完成。
它也可以在“ - 分配 - 解锁 - 锁定完成”来完成的方式,如果你的游戏整理过程可能会持续太长时间,从而使第二用户不会等待答复太长。
你可以简单地使用并发字典存储锁和使用双重检查锁定,以尽量减少lock
S,但有些人认为它是一个反模式。
在你的情况下,谁提交的结果将采取锁和第一玩家完成游戏:
private readonly ConcurrentDictionary<int, object> _gameLocks = new ConcurrentDictionary<int, object>();
// Finish process:
if (!GameIsFinished(gameId))
{
lock (_gameLocks.GetOrAdd(gameId, new object())
{
if (!GameIsFinished(gameId)) {
FinishGame(gameId);
}
}
}
即使第二线穿过第一检查(在竞争条件的情况下),那么它会等待直到第一次完成整理过程,然后检查GameIsFinished
等于true
并且什么都不做。
我只是有几个问题,你的设计:
- 什么如果两个用户在完成之前关闭该窗口?游戏是否被忽略和遗忘?
- 如果用户用自己的
winnerId
更换您的请求,并有两个请求与相同的游戏ID,但不同的WinnerId
。
- ,如果我刚才的垃圾邮件与比赛不同的结果,您的服务器,实际上从来没有玩过吗?
你的服务器应该肯定决定谁是赢家,而不是客户。
如果只有获胜者发送请求,怎么样? – Oscar
请确保只有一个客户端发送请求或将游戏标记为已解决,当您进行API调用时只需检查是否已处理游戏,例如完了。 ('if(!isGameHandled(gameID)){//处理并保存状态}') – jAC
因此,如果Winner网络连接在游戏结束时丢失,会发生什么?我们将失去那场比赛@Oscar。这就是为什么我们强迫两个客户打电话完成 – Nasseh