Add some lock.

This commit is contained in:
AnduinXue
2023-12-10 18:17:46 +00:00
parent be0d29ab5a
commit 46c581b2fa
5 changed files with 18 additions and 31 deletions
@@ -78,21 +78,16 @@ public class GamesController : Controller
public async Task<IActionResult> Move([FromRoute] int id, [FromRoute] string player, [FromRoute] string move)
{
var game = _database.GetOrAddGame(id);
try
lock (game.MovePieceLock)
{
if (!game.Board.IsValidMove(move) || game.Board.IsEndGame || game.Board.Turn.AsChar.ToString() != player)
{
return BadRequest();
}
game.Board.Move(move);
var fen = game.Board.ToFen();
await Task.WhenAll(game.Channel.Broadcast(fen));
return Ok(fen);
}
catch
{
return BadRequest();
}
var fen = game.Board.ToFen();
await Task.WhenAll(game.Channel.Broadcast(fen));
return Ok(fen);
}
}
@@ -16,7 +16,10 @@ public class InMemoryDatabase : ISingletonDependency
public Game GetOrAddGame(int id)
{
return Games.GetOrAdd(id, _ => new Game());
lock (this)
{
return Games.GetOrAdd(id, _ => new Game());
}
}
}
+3 -1
View File
@@ -7,5 +7,7 @@ public class Game
{
public ChessBoard Board { get; set; } = new();
public AsyncObservable<string> Channel { get; set; } = new ();
public AsyncObservable<string> Channel { get; set; } = new();
public object MovePieceLock { get; } = new();
}
@@ -1,11 +0,0 @@
namespace Aiursoft.ChessServer.Models;
public class Message
{
public Message(string content)
{
Content = content;
}
public string Content { get; set; }
}