2012-09-12 52 views
7

我不确定Windows内核是如何处理线程时间的.......NET Thread.Sleep是否受DST(或系统时间)更改影响?

我说的是DST和任何其他影响Windows盒子上的时间的事件。

例如,线程.Sleep将阻塞从零到infinite毫秒的线程。

如果内核使用相同的“时钟”,如用于一天中的时间,那么当

(a)中有人手动改变一天中的时间,或
(b)中的一些同步到时间服务器更改一天中的时间,或
(c)中的夏令时开始或结束,并且系统已经被配置为在这两个DST事件作出响应,
等等

在睡觉第读有什么影响?即内核是否处理这样的事件,以至于程序员不需要做任何事情?

N.B.:对于非关键申请,这很可能是谁在乎?的情况。

对于关键应用,知道这个问题的答案是因为可能性人们必须对这种异常情况,程序的重要。

谢谢

编辑:我想一个简单的测试,我在LINQPad 4运行。

测试涉及将线程置于睡眠状态,在线程进入睡眠状态的同时启动手动定时器,然后(a)将时间提前一小时,然后进行第二次测试,移动时间倒退两个小时......在这两次测试中,睡眠时间为而非受影响。

底线:使用Thread.Sleep,不需要担心会影响一天中的时间的事件。

这里是微不足道的C#代码:

Int32 secondsToSleep; 
String seconds; 
Boolean inputOkay; 
Console.WriteLine("How many seconds?"); 
seconds = Console.ReadLine(); 
inputOkay = Int32.TryParse(seconds, out secondsToSleep); 
if (inputOkay) 
{ 
    Console.WriteLine("sleeping for {0} second(s)", secondsToSleep); 
    Thread.Sleep(secondsToSleep * 1000); 
    Console.WriteLine("i am awake!"); 
} 
else Console.WriteLine("invalid input: [{0}]", seconds); 

回答

8

不,Thread.Sleep不受影响。内核还独占了UTC的时间。时区和DST只是在上面分层。

+1

为了扩大这一点,'Thread.Sleep'不受影响,因为内部内核使用这类作业的tick计数(自系统启动以来的毫秒数),并且没有办法手动调整tick计数。 (其实它有点复杂,但细节并不重要。) –

+0

@ Joey thnx;哈里约翰斯顿评论说,内核使用滴答计数...所以UTC甚至会涉及? – gerryLowry

+0

@哈利约翰斯顿thnx;只是好奇,这是记录在哪里?这是我的怀疑,但我不知道它在哪里被记录。考虑到[tick count](http://msdn.microsoft.com/en-us/library/system.environment.tickcount。aspx)在系统启动时重置,那么它几乎肯定会被任何(重新)设置的时间放在一起。 – gerryLowry

相关问题