DispatcherTimer в Silverlight 4 теряет время - что точнее? - PullRequest
0 голосов
/ 10 августа 2010

У меня есть таймер игры в покер Приложение Silverlight, которое теряет время (после работы в течение 1 часа 40 минут оно потеряло 3 минуты).

Я использую таймер DispatcherTimer в своем классе Турнира, и на каждом тике я вызываю событие, на которое подписывается пользовательский интерфейс для обновления экрана (с помощью текстового блока DataBound).Затем я проверяю, закончился ли блайнд или осталось 60 секунд и т. Д .:

private DispatcherTimer timerBlind;


        if (timerBlind == null)
        {
            timerBlind = new DispatcherTimer();
            timerBlind.Interval = TimeSpan.FromSeconds(1);
            timerBlind.Tick += new EventHandler(Timer_Tick);
        }

  void Timer_Tick(object sender, EventArgs e)
    {
        //check if this would be the end of the blind or other key events
        OnTimerTick(new EventArgs());

        BlindSet.TotalTimeRunning = BlindSet.TotalTimeRunning.Add(TimeSpan.FromSeconds(1));

        if (IsTimerBlindRunning)
        {
            BlindSet.TimeLeftInCurrentBlind = BlindSet.TimeLeftInCurrentBlind.Add(TimeSpan.FromSeconds(-1));

            if (BlindSet.TimeLeftInCurrentBlind.TotalSeconds == 0)
            {
                //advance the level = blinds have gone up
                blindset.EndOfBlindGoToNextLevel();
            }
        }
    }

Итак, как мне сделать его более точным?Спасибо за любой совет ...

1 Ответ

3 голосов
/ 10 августа 2010

Не использовать:

BlindSet.TotalTimeRunning = BlindSet.TotalTimeRunning.Add(TimeSpan.FromSeconds(1));

Вы получаете кумулятивные ошибки, потому что таймеры редко срабатывают точно по сигналу.

Вместо этого сохраните время с начала блайнда (_startTime) и создайте свойство:

TimeSpan TotalRunningTime{
    get{
        return DateTime.UtcNow-_startTime;
    }
}

Примените этот подход и к TimeLeftInCurrentBlind.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...