您需要使用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