IT

C# 프로그램을 50밀리초 동안 sleep 상태로 만들려면 어떻게 해야 하나요?

itgroup 2023. 4. 8. 08:24
반응형

C# 프로그램을 50밀리초 동안 sleep 상태로 만들려면 어떻게 해야 하나요?

C# 프로그램을 50밀리초 동안 sleep(일시정지 실행) 상태로 만들려면 어떻게 해야 하나요?

System.Threading.Thread.Sleep(50);

단, 메인 GUI 스레드에서 이 작업을 수행하면 GUI 업데이트가 차단됩니다('슬렁한' 느낌).

삭제만 하면 됩니다.;VB.net에서도 사용할 수 있도록 합니다.

(거의) 모든 프로그래밍 언어로 대기하려면 기본적으로 세 가지 선택지가 있습니다.

  1. 느슨한 대기
    • 지정된 시간 동안 스레드 블록 실행(=은 처리 능력을 소모하지 않음)
    • 차단/대기 스레드에서는 처리할 수 없습니다.
    • 정확하지 않다
  2. 타이트 대기(타이트 루프라고도 함)
    • 프로세서가 전체 대기 시간 동안 매우 비지 상태입니다(실제로 프로세서는 보통 1개의 코어 처리 시간의 100%를 소비합니다).
    • 기다리는 동안 일부 작업을 수행할 수 있습니다.
    • 정밀도
  3. 이전 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

반응형