我正在尝试创建一个包含秒表类使用的应用程序。
Stopwatch sw = new Stopwatch();
sw.Start();
while (play)
{
long timer = sw.ElapsedMilliseconds;
Debug.WriteLine(timer);
}
当我测试此循环并检查已用时间时,我发现该程序缺少几毫秒。
来自调试器输出的一些时钟:
31
32
33
34
35
36
37
38
40< ------ 39错过了
41
42
43
有关如何解决此问题的任何建议?
答案 0 :(得分:5)
您丢失的几百分钟是由于您的程序不是唯一在操作系统上运行的程序。
所以,偶尔会有其他程序获得时间片,而且几分之一的时间被遗漏了。
你无法“修复”它。
答案 1 :(得分:5)
缺少毫秒?您是否希望每秒钟看到一个条目?例如。每秒1000?如果是这样,那将永远不会发生。没有时间API精确到1毫秒。
除了其他操作系统进程(例如任务切换)之外,您在循环中进行分配以及输出流输出这一事实意味着无法实现毫秒精度。您需要一台专用的实时机器才能实现您正在寻找的输出
答案 2 :(得分:0)
Debug.WriteLine可能比1毫秒慢。它没有针对速度进行优化。
您可以添加一个将消息放入列表的调用,然后在运行后将列表写入Debug.WriteLine。 您可以添加将消息发送到Debug.WriteLine的后台任务。
两者都应该防止计时器丢失滴答声。
缺少滴答的另一个原因可能是操作系统或其他程序在两个Debug.WriteLine调用之间做了一些工作。它甚至可能是一台慢机器。
设置线程优先级或在专用计算机上运行此应用程序应该会有所帮助,但Windows上会出现这类计时器问题,因为它从未说过它是实时操作系统。