2012-09-12 2 views
7

Windows 커널이 스레드 타이밍을 처리하는 방법을 잘 모르겠습니다 ....NET Thread.Sleep이 DST (또는 시스템 시간)의 영향을 받습니까?

저는 DST와 Windows 상자에서 시간대에 영향을주는 다른 이벤트에 대해 말하고 있습니다.

예를 들어 스레드 .Sleep은 0에서 infinite 밀리 초까지 스레드를 차단합니다. 커널 시간대에 사용 된 것과 동일한 "시계"를 사용하는 경우

, (A)에 다음 경우

(a) 사람 수동 하루의 시간을 변경

또는
(b) 일부 동기화 ,
등등,

자고 일을 시간 서버는 하루의 시간을 변경하거나
는 (c)는 일광 절약 시간이 시작 또는 종료하고 시스템이 두 DST 이벤트에 응답하도록 구성되어 어떤 식 으로든 영향을 받습니까? 즉, 커널은 프로그래머가 아무것도 할 필요가없는 그러한 방식으로 이벤트를 처리합니까?

N.B. : 중요하지 않은 메시지 응용 프로그램의 경우 이것은 이 누구입니까? 상황. 이 질문에 대한 대답을 알고 중요한 응용 프로그램의

이 때문에 하나는 예외 조건을 프로그래밍해야 가능성 중요하다.

당신에게

편집 감사합니다 : 내가 LINQPad 4에서 실행 한 간단한 테스트를 생각했다.

스레드가 잠자기 상태가되는 것과 거의 같은 시간에 수동 타이머를 시작한 다음 (a) 시간을 한 시간 앞으로 이동시킨 다음 두 번째 테스트를 실행하고 2 시간 전 시간 ... 두 테스트에서 수면 기간은 이 아니며이 영향을받습니다.

결론 : Thread.Sleep을 사용하면 시간에 영향을주는 이벤트에 대해 걱정할 필요가 없습니다.

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은 영향을받지 않습니다 :

여기에 사소한 C# 코드입니다. 커널은 또한 UTC만으로 시간을 유지합니다. 표준 시간대와 DST는 그 위에 계층화되어 있습니다.

+1

이 작업을 위해 내부적으로 커널이 틱 수 (시스템 부팅 후 밀리 초 수)를 사용하고 수동으로 틱을 조정할 수 없으므로이 부분을 조금 확장하면'Thread.Sleep'은 영향을받지 않습니다 카운트. (사실 좀 더 복잡하지만 세세한 부분은 중요하지 않습니다.) –

+0

@ Joey thnx; 해리 존스턴 (Harry Johnston)은 kernal이 진드기 계수를 사용한다고 언급 했으므로 UTC가 참여할 수도 있습니까? – gerryLowry

+0

@ Harry Johnston thnx; 단지 궁금한데,이 문서는 어디에 기록되어 있습니까? 이것은 나의 의심 이었지만 문서화 된 부분을 모르겠습니다. 주어진 [tick count] (http://msdn.microsoft.com/en-us/library/system.environment.tickcount.aspx)가 시스템 시작시 재설정되면 하루 중 시간 설정에 의해 거의 혼자있게됩니다. – gerryLowry

관련 문제