如何制作精确的十进制计时器?

我对此感到非常沮丧..

我有一个名为timer1的计时器和一个名为TimeElapsedTextBox的文本框和一个名为TimeElapsedTextBoxdouble变量,计时器在文本框中每1秒(1000毫秒)滴答一次,我希望它以这种格式显示时间:

 Seconds.PartsOfSecond 

这是Tick事件:

 private void timer1_Tick(object sender, EventArgs e) { TimeTakenToFinish += (double)timer1.Interval / 10000; TimeElapsedTextBox.Text = TimeTakenToFinish; } 

它实际上是按照我想要的方式在文本框中显示它,但它没有正确计算..我的意思是,它的计数不到真正的第二个..

你能告诉我如何解决这个问题吗?

这里的问题是对操作系统工作方式的误解。 当然,您可以将间隔设置为1000ms ,但您不能指望它实际上每秒都打勾。 您在Windows上运行代码,而不是硬(或软)实时操作系统。

另外,您还应该知道计时器的分辨率是有限的,并且截至今天,仅限于系统计时器的准确度,这可能大约是15ms。

您不能指望您的代码在这种环境中确定性地执行。 在任何时候,操作系统都可以先发制人地将您从CPU中解救出来并开始处理其他任务。

虽然我会问,你根本无法获得所需的准确度; 它真的需要吗? 可能不是,但你还没有告诉我们你在这里想要实现的目标,那么谁知道呢?

这也是错的:

 TimeTakenToFinish += (double)timer1.Interval / 10000; 

Interval是一个属性,用于告诉计时器大致应该触发Tick事件的频率。 你实际上并没有测量任何东西,你也可以每次都向你的计数器添加1000.0 / 10000

如果需要更高精度,请使用StopWatch类,该类使用CPU的高性能计时器(如果可用)。 您仍然可以使用计时器根据秒表的当前经过值定期更新UI,即

 void timer1_Tick(...) { var totalSeconds = _someStopwatch.ElapsedMilliseconds / 1000.0; TimeElapsedTextBox.Text = totalSeconds.ToString(); } 

而不是使用计时器,使用DateTime.Now记录开始时间,然后从开始时间减去当前时间(DateTime.Now)。 这将为您提供更准确的计时器,因为它使用系统时钟而不受CPU性能的影响。

或者,您可以使用System.Diagnostics.Stopwatch为您执行此操作。

您仍然可以使用间隔小于一秒的普通计时器来刷新显示时间的标签。