为了账号安全,请及时绑定邮箱和手机立即绑定

为什么.NET定时器仅限于15 ms的分辨率?

为什么.NET定时器仅限于15 ms的分辨率?

弑天下 2019-06-28 11:11:47
为什么.NET定时器仅限于15 ms的分辨率?请注意,我询问的东西将经常调用回调函数,每15毫秒使用如下System.Threading.Timer..我不是在问如何使用这样的方法精确地计时一段代码System.Diagnostics.Stopwatch甚至QueryPerformanceCounter.另外,我读过相关的问题:精确的Windows计时器?System.Timers.Timer()限制在15毫秒以内.NET中的高分辨率定时器这两种方法都没有给我的问题提供一个有用的答案。此外,推荐的MSDN文章,为Windows实现持续更新的高分辨率时间提供程序是关于计时,而不是提供连续的滴答声。上面写着。....有很多关于.NET计时器对象的错误信息。例如,System.Timers.Timer被称为“为服务器应用程序优化的高性能计时器”。和System.Threading.Timer被认为是二等公民。传统观点认为System.Threading.Timer是Windows的包装器定时器队列定时器而那System.Timers.Timer完全是另外一回事。但现实却大不相同。System.Timers.Timer只是一个很薄的组件包装器System.Threading.Timer(只需使用Reflector或ILDASM窥视内部System.Timers.Timer你会看到System.Threading.Timer),并且有一些代码可以提供自动线程同步,这样您就不必这样做了。System.Threading.Timer,事实证明不是定时器队列定时器的包装器。至少在从.NET 2.0到.NET 3.5使用的2.0运行时中没有。使用共享源CLI几分钟就可以看出,运行时实现了自己的定时器队列,类似于计时器队列定时器,但实际上从未调用Win 32函数。看来.NET 4.0运行时也实现了自己的计时器队列。我的测试程序(见下文)在.NET 4.0下提供了与.NET 3.5相似的结果。我已经为计时器队列计时器创建了自己的托管包装器,并证明了我可以获得1ms的分辨率(非常准确),所以我认为我不太可能读错CLI源代码。我有两个问题:首先,是什么原因导致运行时对计时器队列的实现如此缓慢?我不能超过15毫秒的分辨率,而且精确度似乎在-1到+30毫秒之间。也就是说,如果我要求24毫秒,我将得到任何距离从23到54毫秒的滴答。我想我可以花更多的时间与CLI源代码一起寻找答案,但我认为这里的人可能知道。其次,我意识到这很难回答,为什么不使用计时器队列定时器呢?我意识到.NET 1.x必须在没有这些API的Win9x上运行,但它们自Windows 2000以来就已经存在了,如果我没有记错的话,这是.NET 2.0的最低要求。是因为CLI必须在非Windows机器上运行吗?
查看完整描述

目前暂无任何回答

  • 0 回答
  • 0 关注
  • 561 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信