定时器不是从中央时间戳同步运行的

时间:2018-04-13 20:02:01

标签: c# xamarin

我正在创建一个在数据库中设置了中央时间戳的游戏。用户1启动游戏,时间戳被发送到数据库。两个玩家都有一个在他们的应用程序中运行的计时器,运行1个游戏时间和1个更新计时器

玩家1: 假设用户1设置的时间戳是:20:00:00。 然后游戏一直运行到22:00:00。 下一次更新将在20:15:00上。 (15分钟后将再添加15分钟)

玩家2 播放器2从数据库获得完全相同的时间戳:20:00:00 播放器2还将 15分钟添加到中央时间戳。 20:15:00 游戏结束时间也是中心时间戳+2小时22:00:00

但现在问题是:

即使两个设备上的时间戳相同,定时器也至少在3-4秒后运行。当这两个定时器都定位在相同的时间戳上时,这怎么可能?定时器间隔设置为100ms。

我正在使用的代码:

玩家1:

private void InitializeTimer()
{
    StartTime = CurrentGame.StartTime.Value;
    EndTime = StartTime.AddMinutes(CurrentSettings.TotalGameTime); // added 120 minutes
    NextUpdateTime = StartTime.AddSeconds(CurrentSettings.LocationTimePlayers); // added 15 minutes
    NextUpdateTimeAdmin = StartTime.AddSeconds(CurrentSettings.LocatonTimeAdmin); // added 1 minute

    GameTimer = new Timer();
    GameTimer.Interval = 100;
    GameTimer.Elapsed += GameTimer_Elapsed;
    GameTimer.Enabled = true;
}

玩家2:

private void InitializeGameTimer()
{
    StartTime = CurrentGame.StartTime.Value;
    EndTime = StartTime.AddMinutes(CurrentSettings.TotalGameTime); //added 120 minutes
    NextUpdateTime = StartTime.AddSeconds(CurrentSettings.LocationTimePlayers); //added 15 minutes

    GameTimer = new Timer();
    GameTimer.Interval = 100;
    GameTimer.Elapsed += GameTimer_Elapsed;
    GameTimer.Enabled = true;
}

请有人指点我的方向吗?我真的陷入了困境。

非常感谢提前。

编辑,添加了在两台设备上使用的已用事件。

public void GameTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    DateTime now = DateTime.Now;
    if (now >= NextUpdateTime)
    {
        this.StartSearchingForLocationUpdates(this, null);
        //Restart updatetimer(add 15 minutes again)
        NextUpdateTime = NextUpdateTime.AddSeconds(CurrentSettings.LocationTimePlayers);
    }

    EndGameTimeSpan = EndTime.Subtract(now);// amount of gametime left, will be shown on UI
    NextUpdateTimeSpan = NextUpdateTime.Subtract(now);// time till next update, will be shown on UI

    this.GameTimerElapsed(sender, e);
}

2 个答案:

答案 0 :(得分:0)

您使用的是System.Timers.Timer还是System.Windows.Forms.Timer?第一个将按时执行(或接近它,取决于时钟分辨率,你可能会关闭15毫秒左右)。第二个将按时执行,如果此时没有其他窗口消息要解析。对于游戏,你几乎肯定想要第一个。

答案 1 :(得分:0)

找到解决方案!一台设备上的当前时间在5秒后运行。所以这不是我的代码导致问题,但电话是。