[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()
지정된 시간 동안 “대기”할 수있는을 확인할 수 있습니다. 스레드를 주위에두고 아무것도하지 않는 것은 결코 좋은 생각이 아닙니다. 나쁜 습관 …