DispatcherTimer似乎太慢了

时间:2015-12-02 12:05:33

标签: c# wpf multithreading timer

我不确定SO是否适合这类问题。但是,我会尝试一下。

因为它可以在互联网上找到,使用DispatcherTimer进行WPF中的倒计时,似乎是要走的路。所以我做到了。

我的问题是,计时器似乎不正确(太慢)。

我检查系统时钟(因此它不是100%但足够接近)。

它指出,1分钟的系统时钟只有大约58.5秒的计时器。当低于60岁时,它会变得更糟。

代码(ViewModel):

private readonly DispatcherTimer _timer = new DispatcherTimer(DispatcherPriority.Send, Application.Current.Dispatcher);

ctor(){
    _timer.Interval = TimeSpan.FromSeconds(1);
    _timer.IsEnabled = false;
    _timer.Tick += TimerOnTick;
    _timer.Start();
}

private void TimerOnTick(object sender, EventArgs e)
{
    HandleTimeUpdateAsync();
}

private void HandleTimeUpdateAsync()
{
    new Thread(() =>
    {
        CurrentTime = _currentTime.Add(_currentTime < TimeSpan.FromMinutes(1) ? TimeSpan.FromMilliSeconds(-100) : TimeSpan.FromSeconds(-1));
    }
}

CurrentTime是触发OnPropertyChanged - 事件的属性,格式化时间显示为'mm:ss'(&gt; 60s)或'ss.f'(&lt; 60s)

private TimeSpan _currentTime;
private TimeSpan CurrentTime
{
    get { return _currentTime; }
    set
    {
        if (_currentTime == value)
        {
            return;
        }

        // set timer-interval to 1/10 second when last minute
        if (value.TotalSeconds < 60 && _timer.Interval != new TimeSpan(0, 0, 0, 0, 100))
        {
            _timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
        }

        _currentTime = value;
        OnPropertyChanged(nameof(FormattedCurrentTime));
    }
}

我不知道我能做什么。我没看到的代码是否有错误?

编辑#1

通过注释,每个tick的处理比显示的代码更复杂。它不仅会更新CurrentTime值。

0 个答案:

没有答案