2012-09-12 6 views
7

Ich bin mir nicht sicher, wie der Windows-Kernel Thread-Timing ...Ist .NET Thread.Sleep von DST- (oder Systemzeit-) Änderungen betroffen?

Ich spreche über DST und andere Ereignisse, die die Tageszeit auf Windows-Boxen beeinflusst.

zum Beispiel wird Thread .Sleep einen Thread von Null bis infinite Millisekunden blockieren.

, wenn der Kernel die gleiche „Uhr“, wie es für Tageszeit verwendet wird, verwendet, dann, wenn

(a) jemand manuell die Tageszeit ändert, oder
(b) einige Synchronisation auf ein Zeitserver ändert die Tageszeit oder
(c) Sommerzeit beginnt oder endet und das System so konfiguriert wurde, auf diese beiden DST Ereignisse zu reagieren,
et cetera,

schlafen th liest in irgendeiner Weise betroffen? h. behandelt der Kernel solche Ereignisse auf eine solche Weise, dass der Programmierer nichts tun muss?

N.B.: für nicht-kritische Anwendungen, das ist wahrscheinlich ein wen interessiert das? Situation.

Für kritische Anwendungen ist die Antwort auf diese Frage zu kennen wichtig, weil der Möglichkeit, die man für eine solche Ausnahmebedingungen programmieren müssen.

danke

edit: Ich dachte an einen einfachen Test, den ich in LINQPad 4 ausgeführt haben.

Der Test beinhaltete das Einschlafen des Threads, das Starten eines manuellen Timers ungefähr zur selben Zeit, als der Thread eingeschlafen wurde, und dann (a) die Zeit um eine Stunde vorrücken, dann für den zweiten Test die Zeit zurück zwei Stunden ... in beiden Tests war die Zeit des Schlafes nicht betroffen.

Fazit: Mit Thread.Sleep müssen Sie sich keine Gedanken über Ereignisse machen, die sich auf die Tageszeit auswirken.

hier ist das trivial C# -Code:

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); 

Antwort

8

Nein, Thread.Sleep nicht betroffen. Der Kernel behält außerdem ausschließlich die Zeit in UTC. Zeitzonen und DST sind nur darüber geschichtet.

+1

Um dies etwas auszudehnen, ist 'Thread.Sleep' nicht betroffen, da intern der Kernel die Tick-Anzahl (die Anzahl der Millisekunden seit dem Systemstart) für diese Art von Job verwendet und es keine Möglichkeit gibt, das Tick manuell anzupassen Anzahl. (Eigentlich ist es etwas komplizierter, aber das feine Detail ist nicht wichtig.) –

+0

@ Joey thnx; Harry Johnston hat kommentiert, dass der Kernal die Tick-Zählung benutzt ... also wäre UTC sogar involviert? – gerryLowry

+0

@ Harry Johnston thnx; nur neugierig, wo ist das dokumentiert? Das war mein Verdacht, aber ich weiß nicht, wo es dokumentiert ist. Angesichts der Tatsache, dass die Anzahl der Ticks (http://msdn.microsoft.com/en-us/library/system.environment.tickcount.aspx) wird beim Systemstart zurückgesetzt, dann wäre es fast sicher durch eine (Neu-) Einstellung der Uhrzeit in Ruhe gelassen. – gerryLowry