【发布时间】:2016-03-04 18:51:52
【问题描述】:
.net 框架有很多方法可以使用计时器,但是对于节拍器,我应该使用哪一种呢?
我尝试了所有这些计时器,但没有一个足够准确以供我使用(它们的分辨率不能低于 15 毫秒)。
System.Windows.Forms.Timer
System.Web.UI.Timer
System.Diagnostics.Stopwatch
System.Timers.Timer
System.Threading.Timer
对于我的节拍器课程,我需要 Ticks 可靠、恒定、无漂移。
我在 MSDN 上找到了这个实现:https://msdn.microsoft.com/en-us/library/aa964692(v=vs.85).aspx 使用“coredll.dll”
另一种解决方案是实现这些原生方法:
[DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeSetEvent")]
internal static extern UInt32 TimeSetEvent(UInt32 msDelay, UInt32 msResolution, MultimediaTimerCallback callback, ref UInt32 userCtx, UInt32 eventType);
[DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeKillEvent")]
internal static extern void TimeKillEvent(UInt32 uTimerId);
在 windows 上设置分辨率低于 5 毫秒的计时器的最佳方法是什么?
编辑
我在.net(法语)中发现了这个关于计时器的非常有趣的链接: http://www.e-naxos.com/Blog/post/NET-et-ses-timers-Prise-de-tete-ou-reelle-utilite-.aspx
【问题讨论】:
-
你试过 DispatcherTimer 吗?
-
DispatcherTimer的分辨率和其他的一样,最好的是System.Diagnostics.Stopwatch。DispatcherTimer用于操作对象 UI,它不准确,因为在 Dispatcher 堆栈上进行了评估,还是我错了? -
似乎合法。我只是经常使用这个,因为它似乎是最适合我需要的功能。
-
timeSetEvent() 几乎就是为此而设计的,但是您还必须调用 timeBeginPeriod() 以使分辨率足够好。