400 likes | 505 Views
Responsywne aplikacje w Windows 8 i .NET 4.5. Jakub Binkowski. O mnie. Jakub Binkowski. 2008 - 2011. Lead .NET Developer. Agenda. User Experience. async. Windows 8 Runtime. Internals i architektura. Responsywność. Dlaczego responsywność ?. User Experience !.
E N D
Responsywne aplikacje wWindows 8 i .NET 4.5 Jakub Binkowski
O mnie Jakub Binkowski 2008 - 2011 Lead .NET Developer
Agenda User Experience async Windows 8 Runtime Internalsi architektura
Dlaczego responsywność? • User Experience!
Cechy responsywnej aplikacji • Aplikacja nie zawiesza się • Natychmiastowa odpowiedź • Postęp pracy / czas do zakończenia / „kręciołek” • Możliwość przerwania pracy
Wywołanie synchroniczne publicvoidLoadGroups() { varclient = newDataServiceClient(); vargroups= client.GetGroups(); foreach (vargroupingroups) { this.Groups.Add(newGroupViewModel(group)); } }
Wywołanie synchroniczne Wątek UI Urządzenie Operacja I/O
Przed i z async Demo
Jak działa async(w aplikacjach UI)? publicasyncTaskLoadGroupsAsync() { varclient = newDataServiceClient(); vargroups = awaitclient.GetGroupsAsync(); foreach (vargroupingroups) { this.Groups.Add(newGroupViewModel(group)); } }
Operacje asynchroniczne(w aplikacjach UI) Wątek UI Urządzenie Operacja I/O Kliknięcie przycisku Dotknięcie ekranu To jest aplikacja jednowątkowa!
Operacje asynchroniczne(w aplikacjach UI) - przypomnienie Wątek UI Urządzenie Operacja I/O
Jak działa async(w aplikacjach serwerowych)? publicasyncTaskLoadGroupsAsync() { varclient = newDataServiceClient(); vargroups = awaitclient.GetGroupsAsync(); foreach (vargroupingroups) { Groups.Add(group); } }
Operacje asynchroniczne(w aplikacjach serwerowych) Wątek 1 Urządzenie Operacja I/O Wątek 2 Wiele wątków ≠ wielowątkowość!
Co zrobi kompilator? publicTaskLoadGroupsAsync() { var client = newDataServiceClient(); vargetGroupsTask = client.GetGroupsAsync(); getGroupsTask.ContinueWith(t => { var groups = t.Result; foreach (var group in groups) { Groups.Add(newGroupViewModel(group)); } }, TaskScheduler.FromCurrentSynchronizationContext()); returngetGroupsTask; } Uwaga! Bardzo duże uproszczenie.
Metody async publicasyncvoidFireAndForget() { /*...*/ } publicasyncTaskFireAndRemember() { /*...*/ } publicasyncTask<int> FireAndReturn() { /*...*/ return 1; }
asyncTask vs asyncvoid asyncTaskXxx() asyncvoidXxx() • „Fire and forget” • Przeznaczenie: • Event handlery • Kompatybilność wstecz • Można poczekać na zakończenie wykonania (i sprawdzić np. exception)
Anonimowy async? Czemu nie! Func<Task<int>> fireAndReturn = async ()=> { /**/ return 1; };
Async w Windows Runtime User Interface HTML5 / CSS XAML DirectX Controls Data Binding SVG Tiles Input Accessibility Printing Communications & Data Devices Geolocation NFC Printer Contracts XML Web Sensors Portable Devices Streams Networking Notifications Media AtomPub Local & Cloud Storage Capture Visual Effects SMS Background Transfer Transcoding PlayTo Fundamentals App Lifetime Authentication Cryptography Globalization .NET Win32
IAsync* a Task IAsyncAction Task IAsyncOperation<TResult> Task<TResult>
Pytanie Czy skoro można wywołać na: • Task • IAsyncAction/Operation to czy można wywołać na czymś jeszcze innym?
await – na czym można „czekać”? var my = newMyClass(); await my; publicclassMyClass { publicMyAwaiterGetAwaiter() { /*..*/} } publicclassMyAwaiter : INotifyCompletion { publicboolIsCompleted { get{/*...*/} } publicvoidGetResult() {/*..*/} publicvoidOnCompleted(Actioncontinuation) {/*..*/} } Może też być extensionmethod
Co będzie w zmiennej type? vartask = Task.Run<int>( newFunc<int>(() => { thrownewException(); })); try { awaittask; } catch(Exception ex) { stringtype = ex.GetType().Name; } vartask = Task.Run<int>( newFunc<int>(() => { thrownewException(); })); task.ContinueWith(t => { try { var res = t.Result; } catch (Exception ex) { stringtype = ex.GetType().Name; } });
await a Exception Demo
Czy tak piszemy aplikacje? privateasyncvoid Button_Click_1(objectsender, RoutedEventArgse) { varwc = newWebClient(); var data = awaitwc.DownloadDataTaskAsync(tb.Text); //... }
Co z tą architekturą? • Wzorce, np. MVVM? • Warstwy: • logiki biznesowej, • dostępu do danych?
Podsumowanie • async – okiełznanie asynchroniczności • W .NET – nowe metody • W Windows Runtime – jedyny model • Wpływ na architekturę