代码之家  ›  专栏  ›  技术社区  ›  Rodney

计时器未定期更新,每秒“跳过”(Silverlight 4 DispatcherTimer)

  •  2
  • Rodney  · 技术社区  · 14 年前

    对于以下问题,我非常感谢您的帮助-您可以在我的 live poker blinds timer :

    主时钟(盲计时器倒计时)从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");
                    }
                }
            }
    

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

    TimeStarted = DateTime.UtcNow;
    

    我认为这与以下事实有关:勾选不一定精确到一秒钟,并且用户界面不知何故滞后并跳过一秒钟,但是两个计时器同时在勾选事件中更新(TimerunningForCurrentBlindFormatted(这是最长的已用时间)和TimeLeftInCurrentBlindFormatted)。

    在我的dev系统上,计时器从20:00到19:59,然后到19:57。

    2 回复  |  直到 14 年前
        1
  •  2
  •   spender    14 年前

    不要每秒钟触发一次调度计时器。更频繁地发射它…也许每100毫秒。

        2
  •  1
  •   Mitch Wheat    14 年前

    从这里, DispatcherTimer Class :

    定时器不能保证执行 当时间间隔发生时, 但他们保证不会执行 在时间间隔发生之前。这个 是因为调度程序计时器操作 放置在调度程序队列中 像其他操作一样。当 DispatcherTimer操作执行为 依靠其他工作 排队及其优先级。