C# 프로그램을 50밀리초 동안 sleep 상태로 만들려면 어떻게 해야 하나요?
C# 프로그램을 50밀리초 동안 sleep(일시정지 실행) 상태로 만들려면 어떻게 해야 하나요?
System.Threading.Thread.Sleep(50);
단, 메인 GUI 스레드에서 이 작업을 수행하면 GUI 업데이트가 차단됩니다('슬렁한' 느낌).
삭제만 하면 됩니다.;
VB.net에서도 사용할 수 있도록 합니다.
(거의) 모든 프로그래밍 언어로 대기하려면 기본적으로 세 가지 선택지가 있습니다.
- 느슨한 대기
- 지정된 시간 동안 스레드 블록 실행(=은 처리 능력을 소모하지 않음)
- 차단/대기 스레드에서는 처리할 수 없습니다.
- 정확하지 않다
- 타이트 대기(타이트 루프라고도 함)
- 프로세서가 전체 대기 시간 동안 매우 비지 상태입니다(실제로 프로세서는 보통 1개의 코어 처리 시간의 100%를 소비합니다).
- 기다리는 동안 일부 작업을 수행할 수 있습니다.
- 정밀도
- 이전 2개의 조합
- 이것은 보통 1.의 처리 효율과 정밀도 + 2의 무언가를 할 수 있는 능력을 결합합니다.
1의 경우 - C#의 대기 상태가 느슨함:
Thread.Sleep(numberOfMilliseconds);
단, 윈도 스레드스케줄러에 따라서는Sleep()
약 15ms(sleep은 1ms만 기다리도록 예약되어 있어도 20ms를 쉽게 기다릴 수 있습니다).
C#의 대기 시간은 다음과 같습니다.
Stopwatch stopwatch = Stopwatch.StartNew();
while (true)
{
//some other processing to do possible
if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
{
break;
}
}
또,DateTime.Now
또는 기타 시간 측정 수단, 단,Stopwatch
훨씬 더 빠릅니다(그리고 이것은 타이트 루프에서 실제로 볼 수 있습니다.
3의 경우 - 조합:
Stopwatch stopwatch = Stopwatch.StartNew();
while (true)
{
//some other processing to do STILL POSSIBLE
if (stopwatch.ElapsedMilliseconds >= millisecondsToWait)
{
break;
}
Thread.Sleep(1); //so processor can rest for a while
}
이 코드는 스레드를 1ms(또는 OS 스레드 스케줄에 따라서는 약간 이상) 동안 차단하기 때문에 프로세서가 그 시간 동안 비지 상태가 되지 않고 코드가 프로세서의 전력을 100% 소비하지 않습니다.차단 사이에 다른 처리도 수행할 수 있습니다(예: UI 업데이트, 이벤트 처리 또는 상호 작용/통신 작업).
Windows에서는 정확한 절전 시간을 지정할 수 없습니다.그러기 위해서는 실시간 OS가 필요합니다.최소 수면 시간을 지정하는 것이 최선입니다.그 후 스레드를 깨우는 것은 스케줄러에게 달려 있습니다.그리고 절대 전화하지 마.Sleep()
GUI 스레드에 있습니다.
비동기/대기 기능이 있으므로 작업을 사용하는 것이 가장 좋습니다.지연:
async void foo()
{
// something
await Task.Delay(50);
}
또는 타겟이 되어 있는 경우.NET 4(VS2010 또는 Microsoft용 비동기 CTP 3 사용)BCL.Async)를 사용해야 합니다.
async void foo()
{
// something
await TaskEx.Delay(50);
}
이렇게 하면 UI 스레드를 차단하지 않습니다.
이 코드 사용
using System.Threading;
// ...
Thread.Sleep(50);
Thread.Sleep(50);
스레드는 지정된 시간 동안 운영 체제에 의해 실행되도록 예약되지 않습니다.이 메서드는 스레드 상태를 변경하여 WaitSleepJoin을 포함합니다.
이 메서드는 표준 COM 및 Send Message 펌핑을 수행하지 않습니다.STAThreadAttribute를 가진 스레드에서 sleep을 실행해야 하지만 표준 COM 및 SendMessage 펌핑을 실행하는 경우 타임아웃 간격을 지정하는 Join 메서드의 오버로드 중 하나를 사용하는 것을 고려해 주십시오.
Thread.Join
읽기 쉽도록 하기 위해:
using System.Threading;
Thread.Sleep(TimeSpan.FromMilliseconds(50));
로부터 시작합니다.NET Framework 4.5에서는 다음을 사용할 수 있습니다.
using System.Threading.Tasks;
Task.Delay(50).Wait(); // wait 50ms
양쪽의 장점:
using System.Runtime.InteropServices;
[DllImport("winmm.dll", EntryPoint = "timeBeginPeriod", SetLastError = true)]
private static extern uint TimeBeginPeriod(uint uMilliseconds);
[DllImport("winmm.dll", EntryPoint = "timeEndPeriod", SetLastError = true)]
private static extern uint TimeEndPeriod(uint uMilliseconds);
/**
* Extremely accurate sleep is needed here to maintain performance so system resolution time is increased
*/
private void accurateSleep(int milliseconds)
{
//Increase timer resolution from 20 miliseconds to 1 milisecond
TimeBeginPeriod(1);
Stopwatch stopwatch = new Stopwatch();//Makes use of QueryPerformanceCounter WIN32 API
stopwatch.Start();
while (stopwatch.ElapsedMilliseconds < milliseconds)
{
//So we don't burn cpu cycles
if ((milliseconds - stopwatch.ElapsedMilliseconds) > 20)
{
Thread.Sleep(5);
}
else
{
Thread.Sleep(1);
}
}
stopwatch.Stop();
//Set it back to normal.
TimeEndPeriod(1);
}
언급URL : https://stackoverflow.com/questions/91108/how-do-i-get-my-c-sharp-program-to-sleep-for-50-milliseconds
'IT' 카테고리의 다른 글
iOS 7의 기본 파란색을 프로그래밍 방식으로 가져오려면 어떻게 해야 합니다. (0) | 2023.04.13 |
---|---|
T-SQL: 문자열 연결과 반대 - 문자열을 여러 레코드로 분할하는 방법 (0) | 2023.04.13 |
'<' 연산자는 향후 사용을 위해 예약되어 있습니다. (0) | 2023.04.08 |
특정 확장자를 가진 모든 파일을 검색하여 교체하는 PowerShell 스크립트 (0) | 2023.04.08 |
NVARCHAR(MAX)의 최대 문자는 얼마입니까? (0) | 2023.04.08 |