Ошибка в распределении

97
08 ноября 2019, 17:50

Имеется код

public void SetTeam(Player player)
        {
            foreach (Team team in Teams.ToArray())
            {
                if (team.IsFull())
                {
                    continue;
                }
                else
                {
                    if (!team.InCommand(player))
                    {
                        team.AddPlayer(player);
                    }
                    break;
                }
            }
        }

Данным кодом я заполняю команды игроками, их всего две, по 1 или 2 игрока, в зависимости от режима. Вот так распределяю:

foreach (Player player in GetPlayers().ToArray())
            {
                SetTeam(player);
                Prespawn(player);
                TeleportToTeamSpawn(player);
            }

Но бывает что игроков распределяет некорректно, бывает что одного игрока бросает в разные команд. Распределение проводиться в таймере.

Team.cs

public class Team
    {
        public string Name { get; set; } = "0";
        public int MaxPlayers { get; set; } = 0;
        public bool IsEliminated { get; set; } = false;
        public Vector3 Spawn { get; set; } = Vector3.Zero;
        public Vector3 Portal { get; set; } = Vector3.Zero;
        public int Points { get; set; } = 0;
        public List<Player> Players = new List<Player>();
        public Team(int maxplayers, string name)
        {
            MaxPlayers = maxplayers;
            Name = name;
        }
        public void AddPlayer(Player player)
        {
            if (IsFull()) return;
            if (!Players.Contains(player))
            {
                Players.Add(player);
            }
        }
        public void RemovePlayer(Player player)
        {
            if (Players.Contains(player))
            {
                Players.Remove(player);
            }
        }
        public bool IsFull()
        {
            if (Players.Count == MaxPlayers)
            {
                return true;
            }
            return false;
        }
        public void Reset()
        {
            IsEliminated = false;
            Points = 0;
            Players.Clear();
            Players = null;
            Players = new List<Player>();
        }
        public bool InCommand(Player player)
        {
            if (Players.Find((x) => x.Username.ToLower() == player.Username.ToLower()) is Player)
            {
                return true;
            }
            return false;
        }
    }

Есть догадка что это происходит из-за разных потоков.

Answer 1

Думаю, что догадка правильная. Класс List<T> имеет свойство SyncRoot Попробуй переписать все свои обращения к методам коллекции следующим образом...

lock (Players.SyncRoot) 
 {
      // Access the collection.
 }
READ ALSO
Изменение значения из задержкой

Изменение значения из задержкой

Использую данную функцию для того чтобы поменять значение флагаТо есть имею переменную которая принимает true or false

120
C# в PowerPoint

C# в PowerPoint

У меня есть презентацияВ неё с помощью c# хочу сделать например перетаскивание объектов или что то другое

108
BindingList и несколько combobox

BindingList и несколько combobox

Подключаю bindingList список comboboxРабочий код:

104
&ldquo;Неверно задано имя папки&rdquo; при запуске батника для регистрации DLL

“Неверно задано имя папки” при запуске батника для регистрации DLL

Задача запустить батник для регистрации DLL, на компе под админом все работаетНо если запустить на другом компе под пользователем пишет "Неверно...

110