计时器不会定期更新并“跳过”秒(Silverlight 4 DispatcherTimer)

时间:2010-08-10 09:25:21

标签: silverlight silverlight-4.0 timer

感谢您对以下问题提供一些帮助 - 您可以在live poker blinds timer上看到此问题:

主时钟(盲人计时器倒计时)在20:00开始,然后跳到19:58。 Level计时器(在屏幕顶部计数) - 同步启动,因此是第二个。

这是我的代码: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");
                }
            }
        }

通过UI启动计时器时,日期时间设置为:

TimeStarted = DateTime.UtcNow;

我认为这与Tick不一定是一秒钟并且UI以某种方式滞后并且跳过第二个这一事实有关,但两个计时器同时在Tick事件中更新(TimeRunningForCurrentBlindFormatted(是最长的经过时间)和TimeLeftInCurrentBlindFormatted)。

在我的开发系统上,计时器从20:00到19:59再到19:57。

2 个答案:

答案 0 :(得分:2)

不要每秒触发DispatcherTimer。更频繁地开火......也许每100毫秒。

答案 1 :(得分:1)

从这里开始,DispatcherTimer Class

  

不保证定时器可以执行   恰好在时间间隔发生时,   但他们保证不会执行   在时间间隔发生之前。这个   是因为DispatcherTimer操作   放在Dispatcher队列中   像其他操作。当。。。的时候   DispatcherTimer操作执行是   依赖于其他工作   队列及其优先级。