ac-lap
ac-lap

Reputation: 1653

new APIs for windows phone 8.1

I am trying to use these two methods (of WP 8) in windows phone 8.1, but it gives error and doesn't compile, most probably becasue they are removed. I tried searching the new APIs but couldn't get any. What are other alternatives for these.

Dispatcher.BeginInvoke( () => {}); msdn link

System.Threading.Thread.Sleep(); msdn link

Upvotes: 11

Views: 8599

Answers (4)

Zack Weiner
Zack Weiner

Reputation: 674

Be aware that not only has the API changed (adopting the API from WindowsStore apps), but the way that the Dispatcher was obtained in windowsPhone 8.0 has changed as well.

@Johan Faulk's suggestion, although will work, may return null under a multitude of conditions.

Old code to grab the dispatcher:

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

New in Windows 8.1 Deployment is not an available object or namespace.

In order to make sure the Main UI Thread dispatcher is obtained, use the following:

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

Additionally, although the method SAYS it will be executed Async the keyword await can not be used in the method invoked by RunAsync. (in the above example the method is anonymous).

In order to execute an awaitable method inside anonymous method above, decorate the anonymous method inside RunAsync() with the async keyword.

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

Upvotes: 6

Farhan Ghumra
Farhan Ghumra

Reputation: 15296

For Dispatcher, try this. MSDN

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

For Thread.Sleep() try await Task.Delay(1000). MSDN

Upvotes: 1

Johan Falk
Johan Falk

Reputation: 4359

They still exists for Windows Phone 8.1 SIlverlight Apps, but not for Windows Phone Store Apps. The replacements for Windows Store Apps is:

Sleep (see Thread.Sleep replacement in .NET for Windows Store):

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

Dispatcher (see How the Deployment.Current.Dispatcher.BeginInvoke work in windows store app?):

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

Upvotes: 14

Chris Shao
Chris Shao

Reputation: 8231

Dispatcher.BeginInvoke( () => {}); is replaced by

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

and System.Threading.Thread.Sleep(); is replaced by

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

Upvotes: 9

Related Questions