Add some lock.
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
Reference in New Issue
Block a user