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

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

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

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


person ac-lap    schedule 12.05.2014    source источник


Ответы (4)


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

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

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

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

CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { });
person Johan Falk    schedule 12.05.2014

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

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

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

await Task.Delay(TimeSpan.FromSeconds(doubleValue));
person Chris Shao    schedule 12.05.2014

Имейте в виду, что изменился не только API (принятие API из приложений WindowsStore), но и способ получения Dispatcher в 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 Развертывание не является доступным объектом или пространством имен.

Чтобы убедиться, что диспетчер Main UI Thread получен, используйте следующее:

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

Кроме того, хотя метод ГОВОРИТ, что он будет выполняться асинхронно, ключевое слово await нельзя использовать в методе, вызываемом RunAsync. (в приведенном выше примере метод является анонимным).

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

CoreApplication.MainWindow.CoreWindow.Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
**async**()=>{
      // UI code goes here
      var response = **await** LongRunningMethodAsync();
});
person Zack Weiner    schedule 25.06.2014
comment
Все ли изменилось снова после этого поста или я что-то упустил? Ваше размещение await приводит к синтаксической ошибке, как и мой собственный код, когда я перемещаю await из положения, предшествующего Dispatcher, в место, предшествующее анонимному методу. private async void PlayLaser() { DIspatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, await () =› { laser.Play(); }); } (Я пытался вообще не ждать, но мой звук иногда слишком задерживается.) - person sraboy; 07.09.2015
comment
Пожалуйста, будьте более конкретными, Windows 8.1 не изменилась с момента написания этого поста. Что касается Windows 10, это может быть неподходящая ветка, поскольку она помечена как WindowsPhone 8.1. Многие API-интерфейсы полностью изменились в WindowsPhone 10, чтобы унифицировать ОС. - person Zack Weiner; 08.09.2015
comment
Я использую Windows 10, но создаю универсальное приложение для 8.1 и телефона 8.1 с помощью VS2015. Это не Win10 Universal. - person sraboy; 09.09.2015
comment
Пожалуйста, перечитайте последний блок кода моего примера вместе с примечаниями над ним. Ваш «проблемный код» помещает await в то место, где должно быть *async, и не ожидает вызов laser.play(), который вызывается синхронно. Это потому, что вы разместили await перед анонимным методом, что невозможно. Это должно помочь: ---- private async void PlayLaser() { Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =› { await laser.Play(); }); } - person Zack Weiner; 09.09.2015
comment
Дох! Но Play() не ожидается. Я думал, что использую Dispatcher.RunAsync() для асинхронного запуска Play(), не так ли? Кроме того, я все еще получаю предупреждения об отсутствии ожидания перед Dispatcher.RunAsync() в моем асинхронном методе. О, ладно, думаю, мне есть что почитать. - person sraboy; 09.09.2015

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

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

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

person Farhan Ghumra    schedule 12.05.2014