private void PlayerWatcherCycle() { PlayerWatcherLock.Reset(); var watch = Stopwatch.StartNew(); while (!PlayerWatcherToken.IsCancellationRequested) { List <P3DPlayer> players; lock (Clients) players = new List <P3DPlayer>(Clients); foreach (var player in players.Where(player => player.LevelFile != null && !NearPlayers.ContainsKey(player.LevelFile))) { NearPlayers.TryAdd(player.LevelFile, null); } foreach (var level in NearPlayers.Keys) { var playerList = new List <P3DPlayer>(); foreach (var player in players.Where(player => level == player.LevelFile)) { playerList.Add(player); } var array = playerList.ToArray(); NearPlayers.AddOrUpdate(level, array, (s, players1) => players1 = array); } if (watch.ElapsedMilliseconds < 400) { PlayerWatcherThreadTime = watch.ElapsedMilliseconds; var time = (int)(400 - watch.ElapsedMilliseconds); if (time < 0) { time = 0; } Thread.Sleep(time); } watch.Reset(); watch.Start(); } PlayerWatcherLock.Set(); }