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?