我想知道在运行Timers或StopWatch时在我的程序中使用Thread.Sleep(x)是否有任何看不见的后果......
我有一个秒表正在运行以计算用户按钮按下和定时器之间的时间,该定时器以1秒的间隔打勾以更新时钟。
当其中任何一个正在运行时使用Thread.Sleep(x)会导致精确计时的问题吗? (最重要的是秒表)
答案 0 :(得分:2)
没有什么可以直接干扰Stopwatch
;该对象是被动的,仅在启动或停止时更新,并根据低级QueryPerformanceCounter
和QueryPerformanceFrequency
API的返回值进行报告和响应。电源管理事件(例如暂停,休眠或动态CPU时钟速度变化)可能会导致问题。
至于Timer
类......哪一个,它在触发时需要操纵UI对象?如果是这样,请不要只在UI线程上Sleep
,无论您选择哪个计时器。
System.Windows.Forms.Timer
绑定到它创建的线程,并且如果该线程阻塞而没有泵送消息(Sleep
将执行),则其Tick
事件将被延迟,直到该线程可以再次抽水。
System.Threading.Timer
会将其勾选排队到线程池,因此除非发生大规模干扰,否则不会被中断。但是,由于使用了线程池,tick处理程序无法直接操作UI对象;它将需要使用Invoke
封送对UI线程的调用,如果UI线程正在休眠或者没有抽取消息,则Invoke
将阻止。
System.Timers.Timer
可能是最复杂的一部分;它可以配置synchronization provider来编组调用正确的同步上下文,但是如果UI线程处于休眠状态或者没有提取消息,它也无法更新UI。
答案 1 :(得分:0)
根据您实际使用它们的方式,这是一个广泛的答案......没有代码,这更难解释它如何在您的代码中运行...
睡眠会导致程序暂停操作。该子例程接收一个参数,该参数指示暂停程序的毫秒数。睡眠不使用CPU时间。该计划只是停止运作。
考虑到这一点,它将一般停止程序(暂停),但秒表将继续打勾,因为它在另一个线程上...参见示例......
' Create a Stopwatch and sleep for 5 seconds.
Dim stopwatch As Stopwatch = stopwatch.StartNew
Thread.Sleep(5000)
stopwatch.Stop()
秒表将会运行,直到你停止它为止......
答案 2 :(得分:0)
我遇到了类似的问题,可能是您遇到了类似的小问题。 秒表。Elapsed具有两个不同的属性,您可以像我一样将它们混淆:
这将给您几秒钟的时间:
stopwatch.Elapsed.Seconds
这会给您传递的总秒数:
stopwatch.Elapsed.TotalSeconds
所以,如果您有类似的东西:
while (stopwatch.Elapsed.Seconds < 61)
{
//do something
}
您将遇到无限循环,就像我曾经遇到过的一样,这个答案使我在研究计时器的过程中发了粉:)