DispatcherTimer在更新UI时每分钟都变慢

时间:2011-12-20 01:37:05

标签: c# wpf timer

我已经实现了一个带有数据绑定的DispatcherTimer,它可以像秒表或计数计时器一样显示音频通话过程中经过的时间。 (正如你在手机中看到的那样)

以下代码在每分钟变慢“1秒”,这在计算账单方面不好。你能告诉我我哪里错了吗?

System.Windows.Threading.DispatcherTimer dispatcherTimer; 
int seconds = 0;
public string Counter { get; set; }
public Timer()
    {
        InitializeComponent();
        this.DataContext = this;
        dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        dispatcherTimer.Interval = new TimeSpan(0, 0, 1);         
    }
  private void dispatcherTimer_Tick(object sender, EventArgs e)
    {

       Counter = (seconds / 3600).ToString() + ":" + (seconds / 60).ToString("00") + ":" + (seconds % 60).ToString("00");
       NotifyPropertyChanged("Counter");
       seconds++;
    }

我将此计时器与互联网和手机中的其他秒表进行了比较,此计时器每分钟都会延迟一秒钟。

2 个答案:

答案 0 :(得分:4)

您依赖于计时器,并且它似乎始终不准确相同的数量。

为什么不及时记录,

private DateTime startTime;

public Timer()
{
    InitializeComponent();
    startTime = DateTime.Now;
}

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    Counter = (DateTime.Now - startTime).ToString();
    ...
}

实际上,这样的代码显示了您遇到问题的原因。 ToString方法更精确地显示计数器,包括毫秒,结果是计时器不是每1秒触发一次,而是更像每1.01秒。

我得到这样的价值,

1.008
1.02
1.031
1.03901

然后您可以将此替换为

private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        TimeSpan elapsedTime = (DateTime.Now - startTime);
        Counter = string.Format("{0:hh\\:mm\\:ss}", elapsedTime);

它的格式就像之前没有毫秒一样。

答案 1 :(得分:1)

您无法确保以1000毫秒的间隔触发事件。您应该计算事件中的秒数,而不是递增持有秒数的字段