我想用Timer_Tick事件在标签中显示毫秒数。但即使我将Timer.interval初始化为1,我也无法获得实际的毫秒数。
答案 0 :(得分:3)
Windows和C#不是创建为实时环境。不保证计时器在属性中设置的精确毫秒上触发。
除此之外,典型的LCD显示器现在以60 Hz运行。因此,您获得的刷新间隔大于1毫秒。这意味着您无法在刷新率小于1000 Hz的显示器上的标签中显示毫秒数。
答案 1 :(得分:1)
如果你更好地解释了你想在问题中做什么,我想你会得到更好的答案!
所以你想创建一个秒表。
执行此操作的方法是使用DateTime.Now
,它返回当前日期和时间。单击“开始”按钮时,将保存DateTime.Now以供以后使用:
private DateTime startTime;
private void StartButton_Click(...)
{
startTime = DateTime.Now;
}
然后,不时地,您需要刷新标签中显示的时间。您已经有一个Timer
,其间隔设置为1.这不会每毫秒触发一次;间隔是近似的。但这不是问题!
private void Timer_Tick(...)
{
TimeSpan timeElapsed = DateTime.Now - startTime;
timeLabel.Text = timeElapsed.TotalSeconds.ToString("0.000");
}
因此,您不必依赖事件触发的频率。您只需计算自启动计时器以来经过的时间!
您可以通过多种方式显示生成的timeElapsed
值。查看Hours
,Minutes
,Seconds
和Milliseconds
字段。
答案 2 :(得分:1)
如果要实施秒表,则可能需要使用班级System.Diagnostics.Stopwatch。看看那个页面,它包含一个示例程序。
Stopwatch
类有方法Start()
,Stop()
和Reset()
来启动/停止/重置测量。您可以使用Elapsed
或ElapsedMilliseconds
来获取到目前为止所测量的时间。
关于秒表课程的解决方案,MSDN说:
秒表通过计算计时器滴答来测量经过的时间 基础计时器机制。如果安装了硬件并运行 系统支持高分辨率性能计数器,然后 秒表类使用该计数器来测量经过的时间。除此以外, 秒表类使用系统计时器来测量经过的时间。使用 Frequency和IsHighResolution字段用于确定精度 和秒表计时实施的解决方案。
顺便说一句:在我的系统上,标记Stopwatch.IsHighResolution
设置为 true ,Stopwatch.Frequency
返回值 3215342 (每秒标记数)这足以测量微秒。
答案 3 :(得分:0)
正如其他人发布的那样,在Windows中等待计时器事件时,您没有获得ms精确的时间。但是,您可以非常精确地测量计时器事件之间的经过时间。通常的方法是使用QueryPerformanceCounter API。