c# async on ios and android - craig dunn, developer evangelist at xamarin

Post on 10-May-2015

5.212 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Fast, fluid, instant-gratification apps are a must for mobile and C# async makes this much easier to accomplish. Xamarin Developer Evangelist, Craig Dunn, demos C# async on mobile apps. Slides are from the Xamarin webinar on C# Async on iOS and Android on August 15, 2013.

TRANSCRIPT

C# Async on iOS and Android

Craig DunnDeveloper Evangelist at Xamarin

@conceptdev

.NET BCL APIs

• Lots of .NET APIs support async; for example:HttpClient.GetStringAsync()HttpClient.PostAsync()FileStream.ReadAsync()FileStream.CopyToAsync()

• and many more...

Complete .NET 4.5 coverage for BCL

iOS

• updated iOS APIs to be async; some examples:ALAssetsLibrary.WriteImageToSavedPhotosAlbumAsync()ALAsset.SetImageDataAsync()SKStoreProductViewController.LoadProductAsync()CLGeocoder.GeocodeAddress()NSUrlConnection.SendRequestAsync()

and many more... 174 async iOS native APIs

Android

• updated Android APIs to be async; some examples:Android.Net.Http.AndroidHttpClient.ExecuteAsync()Android.Bluetooth.BluetoothServerSocket.AcceptAsync()Android.Graphics.BitmapFactory.DecodeFileAsync()Android.Locations.Geocoder.GetFromLocationAsync()Java.IO.File.ListAsync()

and many more... 337 async Android native APIs

Xamarin APIs

• Xamarin.Mobile Geolocator.GetPositionAsync()Contact.SaveThumbnailAsync()

• Xamarin.Auth

FormAuthenticator.SignInAsync()Request.GetResponseAsync(cancellationToken)

• and many more...

Xamarin cross-platform libraries

Xamarin Component Store

• Many components already offer async APIs, eg. Parse!

Powerful, easy to use componentshttp://components.xamarin.com

Using Asyncasync, await, cancellation and error handling

DEMO1) Download Html string2) Download Jpeg image3) Save to Photo Album4) Return Html length

Comparison

1) Download Html string2) Download Jpeg image3) Save to Photo Album

5) Error Handling4) Return Html length

6) InvokeOnMainThread

Callback Hell

Comparison

1) Download Html string2) Download Jpeg image3) Save to Photo Album

5) Error Handling4) Return Html length

6) InvokeOnMainThread

Callback Hell

1) Download Html string2) Download Jpeg image3) Save to Photo Album

5) Error Handling4) Return Html length

Comparison

Async-ified

1) Download Html string2) Download Jpeg image3) Save to Photo Album

5) Error Handling4) Return Html length

Comparison

6) InvokeOnMainThreadone place

not required

Async-ified

Comparison

1) Download Html string2) Download Jpeg image3) Save to Photo Album

5) Error Handling4) Return Html length

6) InvokeOnMainThread

old new!

Compiler Magic• async keyword informs the compiler that this method needs to be “munged” (my term)

• await keyword indicates a suspension point where a callback needs to be generated, along with error handling

• Continuations are generated after each suspension point• Error handling (support for enclosing try-catch) is taken care of

• All you need to remember is async and await• and use Tasks

How to use: async?• async modifier on methods, lambdas and anonymous methods

use Async suffix, eg LoadAsync, SendAsyncreturn Task or Task<T> preferably

- Task for methods that don’t return a value- Task<T> to return a value- void for event handlers only

void for event handlers

How to use: await?• await keyword on awaitable objects (Tasks)

only within an async contextmarks a suspension point - control is returned to callercan’t be used in catch or finally blocksTask, Task<T> or a custom type

get a reference to the Task first

... or just await

How to use: error handling?• async Task or Task<T>

Returned Task State == FaultedException re-thrown when task is awaited

• async void methods (event handlers)Exception is thrown on the current synchronization context and the app will crash...

How to use: cancellation?

How to use: progress reporting?

send events to track progress

BONUS: Combinators• Wait on multiple tasks

Task.WhenAll (IEnumerable<Task>)- requires all the tasks to be completedTask.WhenAny(IEnumerable<Task>)- returns when any of the tasks completes

this kind of loop fine for small numbersof Tasks

Don’t await... give it a try• Docs, Recipes

docs.xamarin.com/• Forums

forums.xamarin.com• Samples

github.com/xamarin

xamarin.com/download

Questions?

top related