代码之家  ›  专栏  ›  技术社区  ›  Pau

C#线程。立即醒来睡觉

  •  6
  • Pau  · 技术社区  · 17 年前

    我正在使用下面的代码

    Thread.Sleep(5);
    

    在while循环的末尾。尝试在迭代之间获得5毫秒的延迟。

    有时它会睡16毫秒。我理解并接受这一点,因为这取决于CPU何时开始为线程提供服务。然而,一旦它在下一次迭代中被唤醒,它似乎会在睡眠调用之后立即被唤醒(我用时间戳记录)。使用如此短的睡眠时间间隔会被视为零吗?

    4 回复  |  直到 17 年前
        1
  •  21
  •   Jonathan Rupp    17 年前

    DateTime.UtcNow 分辨率约为10-15毫秒(尽管我看到文档中说NT3.5的分辨率约为10毫秒)。如果需要更高分辨率的计时,请参阅 Stopwatch 类,特别是 Stopwatch.GetTimestamp()

    还请注意,秒表将仅在高分辨率计时器可用时使用( Stopwatch.IsHighResolution

        2
  •  4
  •   Stack Overflow is garbage    17 年前

    最有可能的问题是,您的计时器分辨率有限。如果它只更新,比如说,每10毫秒更新一次,那么在某些迭代中,您将看到相同的时间戳,即使5毫秒已经过去了。

    您使用哪个计时器生成时间戳?

        3
  •  1
  •   Jon    17 年前

    如果我没记错的话,NT时间切片是在NT内核中引入的,并且仍然以与XP相同的方式处于活动状态,它的运行速度大约为5毫秒。我们正在构建一个实时应用程序,遇到了这个问题。你将无法持续获得5毫秒的睡眠时间。我们发现,你有时会得到10-16毫秒,有时没有毫秒,偶尔却很少得到5毫秒。

    大约5年前我就在做这些测试,但从那时起情况可能已经发生了变化。

        4
  •  0
  •   Ian    17 年前

    你在什么样的系统上运行这个?小间隔可能取决于处理器及其支持的分辨率。我曾经在手持设备上运行过一个应用程序,其中计时器本身的分辨率为16ms。所以它可能与硬件有关。尝试将时间段增加到30毫秒,然后看看是否有效。