首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DispatcherTimer在更新UI时每分钟都会变慢

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

Stack Overflow用户
提问于 2011-12-20 09:37:05
回答 2查看 1.9K关注 0票数 1

我已经实现了一个具有数据绑定的DispatcherTimer,它将充当秒表或计数计时器,以显示音频呼叫期间经过的时间。(正如你在手机上看到的那样)

下面的代码每分钟变慢"1秒“,这不利于计算账单。你能告诉我我哪里错了吗?

代码语言:javascript
复制
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++;
    }

我将这个计时器与互联网和移动设备上的其他秒表进行了比较,这个计时器每一分钟都会延迟一秒。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-20 09:41:23

你依赖于计时器,而它似乎总是不准确。

你为什么不找个时间点把它存储起来

代码语言:javascript
复制
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秒触发一次。

我得到了这样的值,

代码语言:javascript
复制
1.008
1.02
1.031
1.03901

等。

然后,您可以将上面的代码替换为这个,

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

它将像以前一样格式化,不会有毫秒。

票数 4
EN

Stack Overflow用户

发布于 2011-12-20 09:39:36

不能保证事件的触发时间间隔恰好是1000ms。您应该计算事件中的秒数,而不是递增您自己的保存秒数的字段

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8569814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档