[c#] Windows 스토어 용 .NET의 Thread.Sleep 대체

Thread.Sleep 은 Windows 스토어 앱용 .NET에서 지원되지 않는 것 같습니다.

예를 들어,

System.Threading.Thread.Sleep(1000);

.NET Framework (2.0, 3.5, 4.0, 4.5)를 대상으로 할 때는 컴파일되지만 Windows 스토어 앱용 .NET을 대상으로하는 경우에는 컴파일되지 않습니다 (또는 4.5와 스토어를 모두 대상으로하는 휴대용 클래스 라이브러리).

System.Threading.Thread는 여전히 존재하며 Sleep 메서드가 없습니다.

앱에서 몇 초 동안 무언가를 지연시켜야합니다. 적절한 대체품이 있습니까?

지연이 필요한 이유 편집 : 내 앱은 게임이고 지연은 컴퓨터 상대가 다음 동작에 대해 “생각하는”것처럼 보이게하는 것입니다. 이 메서드는 이미 비동기 적으로 호출되었습니다 (메인 스레드가 차단되지 않음). 응답 시간을 늦추고 싶습니다.



답변

Windows 스토어 앱은 비 동시성을 수용하며 “비동기 일시 중지”는 Task.Delay. 따라서 비동기 메서드 내에서 다음과 같이 작성합니다.

await Task.Delay(TimeSpan.FromSeconds(30));

… 또는 원하는 지연. 비동기 메서드는 30 초 후에 계속되지만 모든 식과 마찬가지로 스레드가 차단 되지 않습니다await .


답변

명백한 말은 싫어하지만 누군가가 한 줄을 원할 경우 System.Threading.Tasks.Task.Delay(3000).Wait()


답변

나는 방금 똑같은 문제가 있었고 당신과 공유하고 싶은 또 다른 흥미로운 해결책을 찾았습니다. 스레드를 정말로 차단하려면 다음과 같이 할 것입니다 ( “슬림”힌트에 대해 @Brannon에게 감사드립니다).

// `waitHandle.Set` is never called, so we wait always until the timeout occurs
using (var waitHandle = new ManualResetEventSlim(initialState: false))
{
    waitHandle.Wait(TimeSpan.FromSeconds(5));
}


답변

MainPage.xaml.cs

public MainPage()
{
  this.InitializeComponent();
  this.WaitForFiveSeconds();
}

private async void WaitForFiveSeconds()
{
  await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5));
  // do something after 5 seconds!
}


답변

을 (를) 사용하는 이유 (테스트 목적 제외)는 거의 없습니다 Thread.Sleep().

스레드를 휴면 상태로 보내야하는 아주 좋은 이유가있는 경우 (만) Task.Delay()지정된 시간 동안 “대기”할 수있는을 확인할 수 있습니다. 스레드를 주위에두고 아무것도하지 않는 것은 결코 좋은 생각이 아닙니다. 나쁜 습관 …


답변