2009-05-24 3 views
6

다음 함수는 다음과 같습니다. System.Threading.Thread.Sleep(); 밀리 초 단위로 스레드를 지연시키고 정수 값을 매개 변수로 사용하십시오. 마이크로 초 단위의 스레드 지연 방법이 있습니까? 또는 수면 기능이 부동 값을 취할 수 있습니까? 감사합니다.C#의 시간 지연

+0

짧은 기간 동안 잠을 자야하는 이유가 명시된 경우이 질문에 대한 의미있는 대답을 제공하는 것이 더 쉬울 것입니다. 아마도 Sleep() 호출을 필요로하지 않는 방식으로 필요한 것을 성취하기위한 다른 접근법이있을 수 있습니다. – LBushkin

+0

[내가 스톱워치에 대한 다른 질문에서 말한 것을보십시오] (http://stackoverflow.com/questions/1631501/need-microsecond-delay-in-net-app-for-throttling-udp-multicast-transmission-rate/ 1631542 # 1631542) – Fredou

+0

은 5 월의 질문이었습니다 :-p – Fredou

답변

17

아니요. 85122

에서 윌 딘을 인용 할 수없는 의미 '잠'(즉 포기 예약 된 CPU) 등 짧은 기간 동안. 짧은 시간 동안 지연하고 싶다면 적절한 고해상도 타이머 (예 : '성능 타이머')를 반복적으로 확인하고 우선 순위가 높은 것이 무엇이든지 미리 선회하지 않기를 바란다.

1

Thread.Sleep에서 찾을 수있는 최상의 세분성은 TimeSpan 클래스를 사용하고 있습니다. 불행히도 지원하는 최소 단위는 밀리 초입니다. 마이크로 초 범위에서자는 방법이 없습니다.

+0

그리고 Sleep()을 사용해도 적어도 15 ~ 20 ms 정도가됩니다. – Lucas

+0

@Lucas, 매우 사실입니다. 수면은 세밀한 세분화 된 것이 아니며, 정확히 X 배의 기간 기능을위한 수면을 제공합니다. – JaredPar

10

수면이 처음에는 밀리 초 정도 정확하지 않습니다. 제 생각에 해상도는 하드웨어에 따라 다르며 잠자기 시간은 일반적으로 약 20 밀리 초입니다. 이것은 Sleep과 관련이 있습니다. 현재 Sleep은 현재 스레드의 타임 슬라이스에 남을 수있는 부분을 실제로 해제합니다. 다른 스레드가 실행되도록합니다. 스레드가 다시 실행할 수있는 가장 빠른 시간은 한 스레드 스케줄러 타임 슬라이스가 경과 한 후에입니다. 따라서 해상도는 약 20ms입니다 (시스템의 타임 슬라이스가 20ms라고 가정).

Windows는 실시간 OS가 아니므로, 절전 모드와 다른 대기 모드는 완전히 결정적 일 수 없습니다.

응용 프로그램에 따라 대부분의 경우 절전 모드를 수행 한 다음 타이밍이 중요한 경우 잠깐 기다려야 할 수 있습니다. 또는 정확한 시간을 측정 할 수 있도록 구조를 다시 작성하십시오 (System.Diagnostics.Stopwatch 사용). 밀리 초 범위의 정확한 시간 동안 잠을 잘 수있는 것에 의존하지 않습니다.

first answer in this thread on MSDN도 매우 잘 설명합니다.

+1

필자는 항상 입도가 ~ 55ms, 즉 18 틱/초라고 생각했습니다. – RedFilter

+0

좋은 DOS 시대 (어쩌면 초기 Windows)였습니다. 1,193,180 Hz/2^16 –

1

음표를 정확한 시작 시간에 정확하게 시작해야하는 음악 프로그램을 작성해야했기 때문에 DirectX에서 고해상도 타이머를 사용했지만 내 응용 프로그램도 정상에 머물 렀습니다. hog cpu, 그래서 그것은 다음 행동을 언제 할 지 점검 할 수 있습니다.

OS가 응용 프로그램에 제어권을 반환 할 때를 정확히 알 수있는 방법이 없으므로 Thread.Sleep은 매우 나쁜 선택이 될 수 있으며 언급 한 바와 같이 가장 작은 시간 증가분은 10에서 50ms 사이에서 달라질 수 있습니다. 내 경험.