Responsywne aplikacje w Windows 8 i .NET 4.5
description
Transcript of Responsywne aplikacje w Windows 8 i .NET 4.5
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
Internals i architektura
Responsywność
User Experience!
Dlaczego responsywność?
Projekt UI vs projekt UX
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
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?
Uwaga! Bardzo duże uproszczenie.
public async void FireAndForget() { /*...*/ }
public async Task FireAndRemember() { /*...*/ }
public async Task<int> 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<Task<int>> fireAndReturn = async ()=>
{
/**/
return 1;
};
Anonimowy async? Czemu nie!
Windows Runtimeasync
Async w Windows Runtime
Fundamentals
Authentication Cryptography Globalization .NET Win32App Lifetime
Communications & Data
Contracts XML Web
Networking Notifications
Local & Cloud StorageMedia
Capture
PlayTo
Devices
Sensors
GeolocationPortable Devices
NFC
User Interface
HTML5 / CSS XAML DirectX Controls
Input Accessibility Printing
Data Binding
Tiles
Streams
Background Transfer
SVG
AtomPub
SMS
Printer
Visual Effects
Transcoding
Asynchroniczność w Windows Runtime
Demo
Async w Windows Runtime
IAsync* a Task
IAsyncAction
IAsyncOperation<TResult>
Task
Task<TResult>
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
Co będzie w zmiennej type?
var task = Task.Run<int>( new Func<int>(() => { throw new Exception(); }));try{ await task;}catch (Exception ex){ string type = ex.GetType().Name;}
var task = Task.Run<int>( new Func<int>(() => { 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?