2012-09-12 53 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

相關問題