Responsywne aplikacje w Windows 8 i.NET 4.5 Jakub Binkowski
O mnie Jakub Binkowski Lead.NET Developer
Agenda User Experienceasync Windows 8 Runtime Internals i architektura
Responsywność
User Experience! Dlaczego responsywność?
Projekt UI vs projekt UX
Dlaczego UX ma znaczenie?
Cechy responsywnej aplikacji 1. Aplikacja nie zawiesza się 2. Natychmiastowa odpowiedź 3. Postęp pracy / czas do zakończenia / „kręciołek” 4. Możliwość przerwania pracy
Dlaczego aplikacje się zawieszają? Demo
public void LoadGroups() { var client = new DataServiceClient(); var groups = client.GetGroups(); foreach (var group in groups) { this.Groups.Add(new GroupViewModel(group)); } Wywołanie synchroniczne
Operacja I/O Wątek UI Urządzenie
Przed i z async Demo
public async Task LoadGroupsAsync() { var client = new DataServiceClient(); var groups = await client.GetGroupsAsync(); foreach (var group in groups) { this.Groups.Add(new GroupViewModel(group)); } Jak działa async (w aplikacjach UI)?
Operacje asynchroniczne (w aplikacjach UI) Operacja I/O Wątek UI Urządzenie Dotknięcie ekranuKliknięcie przycisku To jest aplikacja jednowątkowa!
Kolejne kroki do responsywności Demo
Async – więcej szczegółów
Operacje asynchroniczne (w aplikacjach UI) - przypomnienie Operacja I/O Wątek UI Urządzenie
public async Task LoadGroupsAsync() { var client = new DataServiceClient(); var groups = await client.GetGroupsAsync(); foreach (var group in groups) { Groups.Add(group); } Jak działa async (w aplikacjach serwerowych)?
Operacje asynchroniczne (w aplikacjach serwerowych) Operacja I/O Wątek 1 Urządzenie Wątek 2 Wiele wątków ≠ wielowątkowość!
public Task LoadGroupsAsync() { var client = new DataServiceClient(); var getGroupsTask = client.GetGroupsAsync(); getGroupsTask.ContinueWith(t => { var groups = t.Result; foreach (var group in groups) { Groups.Add(new GroupViewModel(group)); } }, TaskScheduler.FromCurrentSynchronizationContext()); return getGroupsTask; } Co zrobi kompilator?
public async void FireAndForget() { /*...*/ } public async Task FireAndRemember() { /*...*/ } public async Task FireAndReturn() { /*...*/ return 1; } Metody async
„Fire and forget” Przeznaczenie: Event handlery Kompatybilność wstecz async Task vs async void Można poczekać na zakończenie wykonania (i sprawdzić np. exception) async void Xxx()async Task Xxx()
Func > fireAndReturn = async ()=> { /**/ return 1; }; Anonimowy async? Czemu nie!
Windows Runtime async
Async w Windows Runtime Fundamentals Communications & Data Media Devices User Interface
Asynchroniczność w Windows Runtime Demo
Async w Windows Runtime
IAsync* a Task IAsyncAction IAsyncOperation Task
Internals, architektura
Na jakim wątku wykona się dalej kod? Demo
Czy skoro można wywołać na: Task IAsyncAction/Operation to czy można wywołać na czymś jeszcze innym? Pytanie
await – na czym można „czekać”? public class MyClass { public MyAwaiter GetAwaiter() { /*..*/ } } public class MyAwaiter : INotifyCompletion { public bool IsCompleted { get {/*...*/} } public void GetResult() {/*..*/} public void OnCompleted(Action continuation) {/*..*/} } var my = new MyClass(); await my; Może też być extension method Może też być extension method
Co będzie w zmiennej type? var task = Task.Run ( new Func (() => { throw new Exception(); })); try { await task; } catch (Exception ex) { string type = ex.GetType().Name; } var task = Task.Run ( new Func (() => { throw new Exception(); })); try { await task; } catch (Exception ex) { string type = ex.GetType().Name; } var task = Task.Run ( new Func (() => { throw new Exception(); })); task.ContinueWith(t => { try { var res = t.Result; } catch (Exception ex) { string type = ex.GetType().Name; } }); var task = Task.Run ( new Func (() => { throw new Exception(); })); task.ContinueWith(t => { try { var res = t.Result; } catch (Exception ex) { string type = ex.GetType().Name; } });
await a Exception Demo
private async void Button_Click_1(object sender, RoutedEventArgs e) { var wc = new WebClient(); var data = await wc.DownloadDataTaskAsync(tb.Text); //... } Czy tak piszemy aplikacje?
Wzorce, np. MVVM? Warstwy: logiki biznesowej, dostępu do danych? Co z tą architekturą?
Wpływ async na architekturę Demo
async – okiełznanie asynchroniczności W.NET – nowe metody W Windows Runtime – jedyny model Wpływ na architekturę Podsumowanie
Dziękuję za uwagę! Pytania?