【问题标题】:What is the minimum time you need to Thread.Sleep( ) to ensure DateTime.Now differs?Thread.Sleep() 确保 DateTime.Now 不同所需的最短时间是多少?
【发布时间】:2010-10-13 00:46:50
【问题描述】:

Thread.Sleep() 确保 DateTime.Now 不同所需的最短时间是多少?

鉴于 DateTime 具有 Ticks 属性,您可以争辩以下内容就足够了:

Thread.Sleep(TimeSpan.FromTicks(1));

这很好,但是这保证对 DateTime.Now 的后续调用不相等吗?

更新: 似乎 DateTime 精度取决于硬件,因此我将使用以下方法:

public static void SleepUntilDateTimeChanges()
    {
        DateTime now = DateTime.Now;
        while(now == DateTime.Now)
            Thread.Sleep(TimeSpan.FromMilliseconds(1));
    }

【问题讨论】:

  • 这有一种不好的代码味道。你能解释一下为什么你首先要做这件奇怪的事情吗?可能有更好的方法来解决您的问题。
  • 是的,它用于测试用例。我需要确保在发生某些事情时不会更新用于表示时间戳的 DateTime 属性。所以,我有一些代码 AssertAreEqual(date1, date2);但是我需要确保这不会仅仅因为测试运行器跑得非常快而通过。我必须承认代码本身有点味道,但在使用它的上下文中它是可以的。我不想把 Sleep(100) 放在任何地方,因为它会减慢测试运行速度。
  • Thread.Sleep 的分辨率约为 30-50 毫秒。睡得少那通常是无稽之谈。您最好使用高频计时器并等待 1 毫秒的滴答声,或者使用比 DateTime 更好的时间容器。
  • 也在做同样的事情。另见:stackoverflow.com/questions/508208/…

标签: c# datetime


【解决方案1】:

“滴答”是 100 纳秒。或 1/10,000 毫秒。 Thread.Sleep毫秒 上运行。虽然它确实接受 TimeSpan,但小于毫秒的值将被忽略(即与零相同)。根据@wal 的说法,只能保证 10 毫秒的分辨率。如果您等待该数量,您应该会获得唯一的 DateTime 实例。

另请参阅 Eric Lippert 的 this explanation,它进一步阐明了 DateTime 精度。

【讨论】:

  • 感谢您的链接。有人发帖说:“从 MSDN 你会发现 DateTime.Now 在所有 NT 操作系统上的分辨率大约为 10 毫秒。”所以我将使用我的更新(上)中发布的方法
  • Kirk,您能否编辑您的答案“如果您等待一整毫秒”,因为根据您发送的链接上的信息,这可能不是真的。然后我可以接受你的回答。 :)
  • 柯克,对不起。无法保证 10 ms 的分辨率,它是特定于硬件的(根据该链接)。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2010-11-09
  • 2014-07-05
  • 2012-02-09
  • 2019-02-05
  • 1970-01-01
相关资源
最近更新 更多