private void PlayerCorrectionCycle() { PlayerCorrectionLock.Reset(); var watch = Stopwatch.StartNew(); while (!PlayerCorrectionToken.IsCancellationRequested) { foreach (var nearPlayers in NearPlayers.Where(nearPlayers => nearPlayers.Value != null)) { foreach (var player in nearPlayers.Value.Where(player => player.Moving)) { foreach (var playerToSend in nearPlayers.Value.Where(playerToSend => player != playerToSend)) { playerToSend.SendPacket(player.GetDataPacket()); } } } if (watch.ElapsedMilliseconds < 10) { PlayerCorrectionThreadTime = watch.ElapsedMilliseconds; var time = (int)(5 - watch.ElapsedMilliseconds); if (time < 0) { time = 0; } Thread.Sleep(time); } watch.Reset(); watch.Start(); } PlayerCorrectionLock.Set(); }