Новые API для Windows Phone 8.1

Я пытаюсь использовать эти два метода (WP 8) в Windows Phone 8.1, но он дает ошибку и не компилируется, скорее всего, из-за их удаления. Я попробовал поиск новых API, но не смог получить. Каковы другие альтернативы для них.

Dispatcher.BeginInvoke( () => {}); ссылка msdn

System.Threading.Thread.Sleep(); ссылка msdn

Ответ 1

Они все еще существуют для приложений Windows Phone 8.1 SIlverlight, но не для приложений Windows Phone Store. Замена для приложений Windows Store:

Сон (см. Thread.Sleep замена в .NET для Windows Store):

await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(30));

Диспетчер (см. Как работает Deployment.Current.Dispatcher.BeginInvoke в приложении для хранения Windows?):

CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { });

Ответ 2

Dispatcher.BeginInvoke( () => {}); заменяется на

await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => {});

и System.Threading.Thread.Sleep(); заменяется на

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

Ответ 3

Имейте в виду, что API не только изменил API (использование API из приложений WindowsStore), но и то, как был удален Диспетчер в WindowsPhone 8.0.

@Johan Faulk предложение, хотя и будет работать, может возвращать null при множестве условий.

Старый код для захвата диспетчера:

var dispatcher = Deployment.Current.Dispatcher;
or
Deployment.Current.Dispatcher.BeginInvoke(()=>{
     // any code to modify UI or UI bound elements goes here 
});

Новое в Windows 8.1. Развертывание не является доступным объектом или пространством имен.

Чтобы убедиться, что диспетчер потоков основного пользовательского интерфейса получен, используйте следующее:

var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
or 
CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
  CoreDispatcherPriority.Normal,
  ()=>{
      // UI code goes here
});

Кроме того, хотя метод SAYS будет выполнен с использованием Async, ключевое слово await не может использоваться в методе, вызванном RunAsync. (в приведенном выше примере метод анонимный).

Чтобы выполнить ожидаемый метод внутри анонимного метода выше, украсите анонимный метод внутри RunAsync() с помощью ключевого слова async.

CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
**async**()=>{
      // UI code goes here
      var response = **await** LongRunningMethodAsync();
});

Ответ 4

Для диспетчера попробуйте это. MSDN

private async Task MyMethod()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { });
}

Для Thread.Sleep() попробуйте await Task.Delay(1000). MSDN