【问题标题】:WPF - A more accurate TimerWPF - 更准确的计时器
【发布时间】:2018-07-17 20:23:38
【问题描述】:

我是 CS 和 WPF 的新手。我将获得一个DateTime 对象并将其设置为我的计时器的开始。但我使用了DispatcherTimer.Tick。稍加注意并使用窗口控件,我会感觉到它不准确。它显然在程序的其他功能旁边的单个线程中。

 DispatcherTimer timer = new DispatcherTimer();
 timer.Interval = TimeSpan.FromSeconds(1);
 timer.Tick += timer_Tick;
 timer.Start();

 void timer_Tick(object sender, EventArgs e)
 {  
     dateTime = dateTime.AddSeconds(1);
     TimeTb.Text = dateTime.ToLongTimeString();
 }

还有其他方法可以让计时器更准确吗?

【问题讨论】:

  • 您的计时器需要“准确”到什么程度?约 15 毫秒的分辨率对于 99% 的用例来说已经足够了。忽略其他任何事情,stackoverflow.com/questions/3744032/… 可能会为您提供一些启示。
  • DispatcherTimer 仅对定期更新 Text 属性有用。它的实际间隔并不重要,尽管当您使用恰好一秒时,您会看到奈奎斯特采样定理所说的内容。使用 100 毫秒对人眼来说是一个合理的折衷方案。

标签: c# wpf datetime time dispatchertimer


【解决方案1】:

不要将秒数相加。这是准确的:

private TimeSpan offset;

void timer_Tick(object sender, EventArgs e)
{  
    TimeTb.Text = (DateTime.Now - offset).ToLongTimeString();
}

如果您想显示自开始时间以来经过的时间:

private DateTime start = DateTime.Now;

void timer_Tick(object sender, EventArgs e)
{  
    TimeTb.Text = (DateTime.Now - start).ToString();
}

【讨论】:

  • 然后减去一个合适的 TimeSpan。您的方法需要无限准确度,而这是不存在的。
【解决方案2】:

当然。看看System.Diagnostics.Stopwatch 类。你在重新发明轮子!

【讨论】:

  • 我无法以正确的方式使用这个类。可以举个例子吗?
  • @F4125h4d:你看了吗?抱歉,该课程的帮助包括一个几乎可以显示所有内容的示例。创建一个秒表,对其调用 Start,调用 Stop,然后获取 myStopwatch.Elapsed 并将其转换为 TimeSpan 对象。我可以写一些代码,但它看起来很像那个示例。msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
相关资源
最近更新 更多