Таймер не обновляется регулярно и «пропускает» секунду (Silverlight 4 DispatcherTimer) - PullRequest
2 голосов
/ 10 августа 2010

Буду признателен за помощь в решении следующей проблемы - вы можете увидеть эту проблему на моем таймере покерных блайндов :

Основные часы (обратный отсчет по таймеру вслепую) запускаются в 20:00, а затем переходят в 19:58. Таймер уровня (который отсчитывается в верхней части экрана) - синхронизируется и, следовательно, является секундой.

Вот мой код: XAML:

TextBlock Text="{Binding TimeLeftInCurrentBlindFormatted}"

и мой турнирный класс:

    private DispatcherTimer timerBlind;
    private DateTime? blindTimeStarted = null;

    public DateTime? BlindTimeStarted
    {
            get
            {
                return blindTimeStarted;
            }
            set
            {
                if (blindTimeStarted != value)
                {
                    blindTimeStarted = value;
                    OnPropertyChanged("BlindTimeStarted");
                    OnPropertyChanged("TimeLeftInCurrentBlind");
                    OnPropertyChanged("TimeLeftInCurrentBlindFormatted");
                    OnPropertyChanged("TimeRunningForCurrentBlind");
                    OnPropertyChanged("TimeRunningForCurrentBlindFormatted");
                }
            }
        }


            public TimeSpan TimeLeftInCurrentBlind
            {
                get
                {
                     return BlindTimeStarted == null ? blindset.CurrentBlind.BlindDuration : BlindTimeStarted.Value.Add(blindset.CurrentBlind.BlindDuration).Subtract(DateTime.UtcNow.Subtract(TotalTimePausedForCurrentBlind)); 
                }
            }
            public string TimeLeftInCurrentBlindFormatted
            {
                get { return Utils.FormatTime(TimeLeftInCurrentBlind); }
            }



            void Timer_Tick(object sender, EventArgs e)
            {
                if (IsTimerBlindRunning)
                {
                    OnPropertyChanged("TimeRunningForCurrentBlindFormatted");
                    OnPropertyChanged("TimeLeftInCurrentBlindFormatted");
                }
            }
        }

Когда таймер запускается через пользовательский интерфейс, устанавливается дата и время:

TimeStarted = DateTime.UtcNow;

Я предполагаю, что это как-то связано с тем фактом, что тик не обязательно точно равен секунде, а интерфейс пользователя как-то отстает и пропускает секунду, но оба таймера обновляются в событии тика одновременно (TimeRunningForCurrentBlindFormatted верхнее истекшее время) и TimeLeftInCurrentBlindFormatted).

В моей системе разработки таймер работает с 20:00 до 19:59, а затем до 19: 57.

Ответы [ 2 ]

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

Не запускайте DispatcherTimer каждую секунду.Срабатывайте чаще ... возможно каждые 100 мс.

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

Отсюда Класс DispatcherTimer :

Таймеры не гарантированно работают точно, когда происходит временной интервал, но они гарантированно не выполнят до наступления временного интервала. это это потому, что операции DispatcherTimer помещаются в очередь Диспетчера как и другие операции. Когда Операция DispatcherTimer выполняется зависит от других рабочих мест в очередь и их приоритеты.

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