我不確定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