感谢您对以下问题提供一些帮助 - 您可以在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。
答案 0 :(得分:2)
不要每秒触发DispatcherTimer。更频繁地开火......也许每100毫秒。
答案 1 :(得分:1)
从这里开始,DispatcherTimer Class:
不保证定时器可以执行 恰好在时间间隔发生时, 但他们保证不会执行 在时间间隔发生之前。这个 是因为DispatcherTimer操作 放在Dispatcher队列中 像其他操作。当。。。的时候 DispatcherTimer操作执行是 依赖于其他工作 队列及其优先级。