Замена 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()
, который вы можете ожидать, чтобы "подождать" в течение определенного времени. Хотя никогда не было хорошей идеи, чтобы нить сидела и ничего не делала. Плохая практика...