为什么System.Timers.Timer.Interval双的数据类型?(Why is the

2019-06-26 11:20发布

这是一个有点学术问题的,因为我与微软背后的思想采用双为Interval属性的数据类型奋斗!

首先从MDSN间隔是时间,以毫秒为单位,经过的事件之间; 我会解释这是个离散数,为什么使用双的? 当然int或长,使更多的意义!?

在时间间隔支撑性值一样5.768585(5.768585毫秒)? 尤其是当一个人认为System.Timers.Timer有隔靴搔痒亚毫秒级精确度...... 在.NET最准确的计时?

似乎有点愚蠢到我..也许我失去了一些东西!

Answer 1:

拆解显示,区间通过将呼叫消耗(int)Math.Ceiling(this.interval)即使你指定一个实数的话,它就会变成一个int使用前。 这发生在一个名为方法UpdateTimer

为什么? 不知道,也许是规范说double被要求在一个点上,并且改变了吗? 最终的结果是, double要求不严格,因为它最终被转换为int且不能大于Int32.MaxValue根据反正文档。

是的,定时器可以“支持”实数,它只是不告诉你,它静静地改变了他们。 您可以初始化并运行定时器100.5d ,它把它变成101

是的,这是所有有点愚蠢:4个字节浪费,潜在的隐式转换,转换的呼叫,显式转换,如果他们刚刚使用的所有不必要的int



Answer 2:

使用双这里的原因是试图提供足够的精度。

详细:该系统中断时间片由ActualResolution给出其通过返回NtQueryTimerResolution() NtQueryTimerResolution是由本地的Windows NT库ntdll.dll输出。 系统时间的增量是由TimeIncrement给出这是由返回GetSystemTimeAdjustment()

这两个值确定所述系统定时器的行为。 他们是整数值和快递100个纳秒单位。 然而,这已经是不够的某些硬件的今天。 在一些系统ActualResolution返回9766这将对应于0.9766毫秒。 但事实上,这些系统以每秒1024个中断操作(由多媒体接口的适当的设定调谐)。 1024中断第二将使中断周期为0.9765625毫秒。 这是过高的细节,达到到100个ps的政权,因此不能在标准ActualResolution格式举行。

因此,它已决定把这样的时间参数为双。 但是:这并不意味着所有的更多钞票值的支持/使用。 通过TimeIncrement给出的粒度将持续存在,不管是什么。

当计时器处理它始终是最好看所涉及的参数的粒度。

所以,回到你的问题: Can Interval support values like 5.768585 (ms) ?

,系统我为例上面不能。

但是,它可以支持5.859375(毫秒)!

具有不同硬件的其他系统可以支持其他号码。

所以这里引入一个双重的想法是不是这样一个愚蠢的想法,实际上是有道理的。 再花4个字节把事情终于右侧是一个很好的投资。

我总结了有关Windows时间问题的更多细节在这里 。



文章来源: Why is the data type of System.Timers.Timer.Interval a double?
标签: c# .net timer