Нитка.Замена сна in.NET для магазина Windows


нить.Спи не поддерживается в .NET для приложений Магазина Windows.

например,

            System.Threading.Thread.Sleep(1000);

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

5 93

5 ответов:

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