Я занимаюсь разработкой игры и использую SignalR.Core версии 3.1.0.0 для событий в реальном времени. Моя проблема, связанная с обработкой одновременного запроса на ту же пустоту. в одной пустоте у меня есть условие, что это условие влияет на игровые сессии. когда первый человек присоединяется к игре, проверяется, не существует ли он, готовые к игре игроки должны установить для этого состояния состояние готовности к игре. но в моем коде, когда два человека присоединяются к игре в одно и то же время (с другой сущностью пользователя и другой нано второй меткой времени), оба человека к игре готовятся. Без внимания к моему состоянию кода !!
мое предположение - когда два человек запросил сыграть в игру, конечно, один человек просил раньше, чем другой человек, поэтому у меня есть один человек в списке 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;
}
}