C# 为确保DateTime.Now不同,您需要线程.Sleep()的最短时间是多少?

C# 为确保DateTime.Now不同,您需要线程.Sleep()的最短时间是多少?,c#,datetime,C#,Datetime,为确保DateTime.Now不同,您需要线程.Sleep()的最短时间是多少 如果DateTime具有Ticks属性,您可以认为以下内容就足够了: Thread.Sleep(TimeSpan.FromTicks(1)); 这很好,但这是否保证了对DateTime.Now的后续调用不相等 更新: 似乎DateTime精度取决于硬件,因此我将使用以下方法: public static void SleepUntilDateTimeChanges() { DateTime

为确保DateTime.Now不同,您需要线程.Sleep()的最短时间是多少

如果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));
    }
“滴答”是100纳秒。或1/10000毫秒<代码>线程。睡眠操作以毫秒为单位。虽然它确实接受
时间跨度
,但小于一毫秒的值将被忽略(即与零相同)。根据@wal,只能保证10毫秒的分辨率。如果等待该金额,则应获得唯一的
DateTime
实例


另请参见Eric Lippert的文章,该文章对日期时间精度有了更多的了解。

感谢您的链接。有人发帖说:“从MSDN上你可以找到DateTime。现在在所有NT操作系统上的分辨率大约为10毫秒。”所以我将使用我的更新(上图)中发布的方法Kirk,你能编辑你的答案“如果你等一整毫秒”吗?考虑到你发送的链接上的信息,这可能不是真的。然后我可以接受你的回答柯克,对不起。10毫秒的分辨率无法保证,它是特定于硬件的(根据该链接)。干杯。看,这也有一种糟糕的代码味道。你能解释一下你为什么要做这件奇怪的事吗?可能有更好的方法来解决您的问题。是的,它是针对测试用例的。我需要确保用于表示时间戳的DateTime属性在发生某些事情时不会更新。因此,我有一些代码assertarequal(date1,date2);然而,我需要确保这不会仅仅因为测试运行者跑得很快就通过。我必须承认目前的代码有点异味,但在使用它的上下文中,它是可以的。我不想让Sleep(100)无处不在,因为它会减慢测试运行速度。Thread.Sleep的分辨率约为30-50毫秒。睡眠不足通常是胡说八道。你最好使用一个高频率计时器,等待1毫秒的滴答声,或者使用一个比DateTime更好的时间容器。我们也这么做了。另见: