我不确定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);
为了扩大这一点,'Thread.Sleep'不受影响,因为内部内核使用这类作业的tick计数(自系统启动以来的毫秒数),并且没有办法手动调整tick计数。 (其实它有点复杂,但细节并不重要。) –
@ Joey thnx;哈里约翰斯顿评论说,内核使用滴答计数...所以UTC甚至会涉及? – gerryLowry
@哈利约翰斯顿thnx;只是好奇,这是记录在哪里?这是我的怀疑,但我不知道它在哪里被记录。考虑到[tick count](http://msdn.microsoft.com/en-us/library/system.environment.tickcount。aspx)在系统启动时重置,那么它几乎肯定会被任何(重新)设置的时间放在一起。 – gerryLowry