Замена Thread.Sleep в .NET для Windows Store

Thread.Sleep не поддерживается в приложениях .NET для Магазина Windows.

Например, это

System.Threading.Thread.Sleep(1000);

будет компилироваться при нацеливании на любой .NET Framework (2.0, 3.5, 4.0, 4.5), но не при нацеливании на приложения .NET для Магазина Windows (или в переносимой библиотеке классов, предназначенной как для 4.5, так и для хранилища).

System.Threading.Thread все еще там, у него просто нет метода Sleep.

Мне нужно отложить что-то на несколько секунд в моем приложении, есть ли подходящая замена?

РЕДАКТИРУЙТЕ, почему необходима задержка: мое приложение - игра, а задержка состоит в том, чтобы заставить его выглядеть так, будто компьютерный противник "думает" о своем следующем шаге. Метод уже вызывается асинхронно (основной поток не заблокирован), я просто хочу уменьшить время отклика.

Ответ 1

Приложения Windows Store охватывают асинхронность, а "асинхронная пауза" предоставляется Task.Delay. Поэтому в асинхронном методе вы должны написать:

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

... или любую задержку, которую вы хотите. Асинхронный метод продолжится через 30 секунд, но поток не будет заблокирован, как и для всех выражений await.

Ответ 2

Ненависть, чтобы заявить очевидное, но в случае, если кто-то хочет одну строку System.Threading.Tasks.Task.Delay(3000).Wait()

Ответ 3

У меня была такая же проблема, и я нашел еще одно интересное решение, которое я хотел бы поделиться с вами. Если вы действительно хотите заблокировать поток, я бы сделал это так (спасибо @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));
}

Ответ 4

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

Ответ 5

Существует почти никаких причин (кроме целей тестирования), КОГДА-ЛИБО использовать Thread.Sleep().

IF (и только если) у вас есть веская причина отправить поток в режим сна, вам может потребоваться проверить Task.Delay(), который вы можете ожидать, чтобы "подождать" в течение определенного времени. Хотя никогда не было хорошей идеи, чтобы нить сидела и ничего не делала. Плохая практика...