Example #1
0
        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();
        }