InconsistentIntervalswithSystem.Windows.Forms.Timer项目。我正在使用System.Windows.Forms.Timer来观察不一致和缓慢的时期。该应用程序是使用MSVisualStudio用C#编写的。计时器设置为100毫秒间隔,但我观察到的时间范围是110毫秒到180毫秒。我正在使用几种工具来观察这一点,包括:-一个SW示波器(Iocomp.Instrumentation.Plotting.Plot包),-一个真正的示波器,-让定时器运行一段时间,并比较ticks*100ms与Bothcompare系统时间和秒表。在所有情况下,我都观察到10%的延迟在最初几秒内变得很明显。该方法在每次滴答执行时的运行时间少于4毫秒。也没有耗时的异步处理。但这无关紧要,因为计时器滴答是一个中断,而不是添加到事件处理程序队列中的事件(据我所知)。有没有人遇到过这样的问题?根本原因是什么?谢谢。计时器仅与操作系统时钟中断一样准确。默认为每秒64次,即15.625毫秒。你不能从那里得到一个干净的100毫秒间隔,它不能被15.625整除。你得到下一个整数倍,7x15.625=109.375毫秒。非常接近您观察到的110毫秒。您需要将处理计时器通知的延迟添加到这个理论最小值。计时器必须与UI线程中发生的所有其他事情竞争。它们被认为是最不重要的通知。首先发送消息,然后是用户输入,然后是绘画,最后是定时消息。无论哪种方式,如果您有一个设计良好的UI需要一段时间来重新绘制,Tick事件将被延迟直到它完成。对于您编写的任何事件处理程序也是如此,它可以执行一些重要的事情,例如读取文件或查询数据库。要获得不受此类延迟影响的响应速度更快的计时器,您需要使用异步计时器。System.Threading.Timer或System.Timers.Timer。避免后者。它们的回调在线程池线程上运行,因此它们可以运行得非常快。你必须非常小心你在这个回调中所做的事情,有很多事情你不能做,因为它们不是线程安全的。通过改变时钟中断率,您可以更准确地定位这些定时器。这需要pinvoke,调用timeBeginPeriod()。timeEndPeriod()完成后。是的,我一直在使用System.Windows.Forms.Timer时遇到这个问题,因为它不准确(大部分时间)。您可以尝试System.Timers.Timer,它可以精确地引发中断(至少100毫秒精度)System.Windows.Forms.Timer实际上只是本机WM_TIMER消息的包装器。这意味着计时器消息被放置在消息队列中,大致接近您请求的时间间隔(正负......这里没有保证)。处理该消息的时间完全取决于队列中的其他消息以及处理每条消息的时间。例如,如果您阻塞了UI线程(从而阻止队列处理新消息),您将无法获得计时器事件,直到您解除阻塞。Windows不是实时操作系统,您不能指望计时器的精细精度。如果您想要更精细的东西,多媒体计时器是您的不二之选。这是旧的,但如果有人来这里寻找真正正确的答案:来自https://msdn.microsoft.com/en-us/library/system.windows.forms.timer(v=vs.110).aspx(强调我的):Windows窗体计时器组件是单线程的,精度限制为55毫秒。如果您需要更高精度的多线程计时器,请使用System.Timers命名空间中的Timer类。因此,使用Windows.Forms.Timer,您可以获得55ms、110ms、165ms等;这与您所看到的一致。如果需要更高的精度,试试System.Timers.Timer或者System.Threading.Timer以上就是C#学习教程的全部内容:InconsistentintervalswithSystem.Windows.Forms.Timer,如果对大家有用需要学习更多关于C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
