Thread.Sleep(x)是否会干扰定时器/秒表?

时间:2014-08-21 01:22:58

标签: vb.net

我想知道在运行Timers或StopWatch时在我的程序中使用Thread.Sleep(x)是否有任何看不见的后果......

我有一个秒表正在运行以计算用户按钮按下和定时器之间的时间,该定时器以1秒的间隔打勾以更新时钟。

当其中任何一个正在运行时使用Thread.Sleep(x)会导致精确计时的问题吗? (最重要的是秒表)

3 个答案:

答案 0 :(得分:2)

没有什么可以直接干扰Stopwatch;该对象是被动的,仅在启动或停止时更新,并根据低级QueryPerformanceCounterQueryPerformanceFrequency 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
}

您将遇到无限循环,就像我曾经遇到过的一样,这个答案使我在研究计时器的过程中发了粉:)