Windows 스토어 용 .NET의 Thread.Sleep 대체


98

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 메서드가 없습니다.

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

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


2
Windows 스토어 앱이 UI를 고정 할 수 없다는 것을 고려하면 (모든 것이 비 동기화되어야 함) 지원되지 않는 것이 합리적입니다.
Sruly

2
이벤트 나 Monitor수업이 있습니까? Wait시간 제한이 있는 메서드를 사용하여 수면을 시뮬레이션 할 수 있습니다.
Tudor

Apptivate.ms 용입니까? : 3
EaterOfCode 2012 년

3
Thread.Sleep나쁜 기술의 쓰레기통으로 추방 해주셔서 감사 합니다.
지출 자

답변:


203

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

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

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


1
불행히도 Task.Delay는 포터블 클래스 라이브러리에서 .NET 4.5 + store + WP7을 대상으로 할 때 지원되지 않는 것 같습니다. 나는 이것을 플랫폼 특정 클래스로 옮길 것이라고 생각합니다.
Max

1
@Max : 아니요, .NET 4.5 이전에는 없었기 때문입니다. IIRC, WP7 자체는 TPL 지원이 없습니다. (내가 틀릴 수 있습니다 ...)
Jon Skeet

4
.RunSynchronously()필요한 경우 붙일 수 있습니다 .
HappyNomad 2013 년

1
@RAM : Well Thread.Sleep .NET 3.5에서 지원되므로 질문이 적용되지 않습니다. 의심 할 여지가 없지만 질문 이 있는 것 같지는 않습니다. tinyurl.com/stack-hints 를 읽고 새로운 질문을하십시오.
Jon Skeet

2
@RAM : 귀하의 의견에서 어떻게 추측해야했는지 잘 모르겠습니다. 이미 WPF 및 애니메이션에 대한 유사한 질문이 많이 있습니다.
Jon Skeet

46

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


20

나는 방금 똑같은 문제가 있었고 당신과 공유하고 싶은 또 다른 흥미로운 해결책을 찾았습니다. 스레드를 정말로 차단하려면 다음과 같이 할 것입니다 ( "슬림"힌트에 대해 @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));
}

이것은 이식 가능한 코딩에 대한 최상의 답변입니다.
zezba9000 2013-10-22

이것의 "슬림"버전을 사용하십시오.
Brannon

11

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!
}

-7

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

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


9
동의하지 않습니다. 스레드가 백그라운드 스레드이고 수면 시간이 짧으면 타이머를 사용하는 것보다 몇 밀리 초 동안 수면하는 것이 더 효율적입니다.
Jason Steele

1
그리고 때때로 당신은 그 결과에 대한 권위적인 인물을 조언 했음에도 불구하고 그것을하도록 지시
Jordan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.