Asynchroniczność w Windows 8

55
Asynchroniczność w Windows 8 Jakub Binkowski

description

Asynchroniczność w Windows 8. Jakub Binkowski. O mnie. Jakub Binkowski. 2008 - 2011. Lead .NET Developer. Agenda. Dlaczego asynchronicz-ność ?. Historia: APM, EAP. async i await. ASP.NET MVC. Windows 8 Runtime. Internals i architektura. Dlaczego asynchroniczność?. - PowerPoint PPT Presentation

Transcript of Asynchroniczność w Windows 8

Page 1: Asynchroniczność w Windows 8

Asynchroniczność w Windows 8Jakub Binkowski

Page 2: Asynchroniczność w Windows 8

O mnie

Jakub Binkowski

2008 - 2011

Lead .NET Developer

Page 3: Asynchroniczność w Windows 8

Agenda

Dlaczego asynchronicz-ność?

Historia:APM, EAP async i await

ASP.NET MVCWindows 8 Runtime

Internals i architektura

Page 4: Asynchroniczność w Windows 8

Dlaczego asynchroniczność?

Page 5: Asynchroniczność w Windows 8

public void DownloadImageAsPng(string url, string fileName){ var webclient = new WebClient(); var imageBytes = webclient.DownloadData(url); using(var imageStream = new MemoryStream(imageBytes)) { var bitmap = Bitmap.FromStream(imageStream); bitmap.Save(fileName, ImageFormat.Png); }}

Przykładowa metoda…

Pobranie z sieci

Zapis na dysk

Page 6: Asynchroniczność w Windows 8

Gdyby 1 cykl procesora = 1 sekunda:

Rejestr: 1s Pamięć: 5-10s Dysk: 3 miesiące Sieć: 30 lat

Ile to trwa?

Page 7: Asynchroniczność w Windows 8

Operacje obliczeniowe

Wątek

Page 8: Asynchroniczność w Windows 8

Operacje I/O synchroniczne

Operacja I/O

Wątek

Urządzenie

Page 9: Asynchroniczność w Windows 8

Różne problemy w różnych środowiskach:

Aplikacje desktop (Metro, WPF, …)

Aplikacje serwerowe (ASP.NET, WCF, …)

Problemy

Page 10: Asynchroniczność w Windows 8

Jest jeden wątek UI Gdy jest zajęty aplikacja przestaje

odpowiadać

Aplikacje desktop

Page 11: Asynchroniczność w Windows 8

Oparte o pulę wątków

Gdy wszystkie wątki z puli są zajęte – żądania się kolejkują

Pula wątków rośnie, ale: Każdy wątek to 1MB zarezerwowanej pamięci

Aplikacje serwerowe

Page 12: Asynchroniczność w Windows 8

Dla uproszczenia: 3 procesory 3 wątki w puli

2 rodzaje operacji: Tylko HTML – szybka operacja w pamięci Dostęp do zewnętrznych zasobów

(DB, Web Service) - wole

Przykład – aplikacja ASP.NET

Page 13: Asynchroniczność w Windows 8

Przykład – aplikacja ASP.NET

HTML DBWeb

ServiceHTML HTML

CPU = 66%

DB

Żądania aktualnie obsługiwaneKolejka żądań

oczekujących

HTML

Page 14: Asynchroniczność w Windows 8

Przykład – aplikacja ASP.NET

HTML DBWeb

ServiceHTML

CPU = 33%

DBHTML

Page 15: Asynchroniczność w Windows 8

Przykład – aplikacja ASP.NET

HTML DBWeb

Service

CPU = 0%

DBHTML

Żądania, któremożna by obsłużyć…

Page 16: Asynchroniczność w Windows 8

Desktop „zawieszenie się”

Server spadek wydajności

Rozwiązanie – operacje asynchroniczne

Problemy operacji synchronicznych

Page 17: Asynchroniczność w Windows 8

Operacje I/O asynchroniczne

Operacja I/O

Wątek 1

Urządzenie

Wątek 2

Page 18: Asynchroniczność w Windows 8

Krótka historia asynchroniczności w .NET

Page 19: Asynchroniczność w Windows 8

Asynchronous Programming Model

Asynchroniczność w .NET 1.1

Demo

Page 20: Asynchroniczność w Windows 8

Wg zespołu Windows Forms APM jest: zbyt skomplikowany nie pasuje do trybu design wymaga pilnowania wątków

Asynchronous Programming Model

Page 21: Asynchroniczność w Windows 8

Event-base Asynchronous Programming

Asynchroniczność w .NET 2.0

Demo

Page 22: Asynchroniczność w Windows 8

public void DownloadFile(string url){ try { var webClient = new WebClient(); var data = webClient.DownloadData(url); //carry on... } catch (Exception ex) { //handle error... }}

Problem APM i EAP…

Page 23: Asynchroniczność w Windows 8

public void DownloadFile(string url){ try { var webClient = new WebClient(); webClient.DownloadDataCompleted += DownloadFileCompleted; webClient.DownloadDataAsync(new Uri(url)); } catch (Exception ex) { //handle error }} private void DownloadFileCompleted(object sender, DownloadDataCompletedEventArgs e){ if (e.Error == null) { var data = e.Result; //carry on... } else { //handle error }}

Problem APM i EAP…

Page 24: Asynchroniczność w Windows 8

Napisać taki kod jak synchroniczny

Niech kompilator zajmie się asynchronicznością

Niech debugger działa jak gdyby kod był synchroniczny

A gdyby można było…

Page 25: Asynchroniczność w Windows 8

A gdyby tak można było…

Page 26: Asynchroniczność w Windows 8

public async void DownloadFile(string url){ try { var webClient = new WebClient(); var data = await webClient.DownloadDataTaskAsync( new Uri(url)); //carry on... } catch (Exception ex) { //handle error... }}

async!

Page 27: Asynchroniczność w Windows 8

public async Task DownloadFile(string url){ var wc = new WebClient(); var data = await wc.DownloadDataTaskAsync(/*...*/); //carry on...}

Jak działa async?

Page 28: Asynchroniczność w Windows 8

async

Demo

Page 29: Asynchroniczność w Windows 8

public Task DownloadFile(string url){ var wc = new WebClient(); var downloadTask = wc.DownloadDataTaskAsync(/*...*/); var continuationTask = downloadTask.ContinueWith(t => { if (t.Exception != null) throw t.Exception.InnerException;  //carry on... }); return continuationTask;}

Co zrobi kompilator?

Uwaga! Bardzo duże uproszczenie.

Page 30: Asynchroniczność w Windows 8

public async void FireAndForget() { /*...*/ } public async Task FireAndRemember() { /*...*/ } public async Task<int> FireAndReturn() { /*...*/ return 1; }

Metody async

Page 31: Asynchroniczność w Windows 8

„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()

Page 32: Asynchroniczność w Windows 8

Func<Task<int>> fireAndReturn = async ()=>{ /**/ return 1;};

Anonimowy async? Czemu nie!

Page 33: Asynchroniczność w Windows 8

ASP.NET MVCasync

Page 34: Asynchroniczność w Windows 8

public class HomeController : Controller{    public ActionResult Download()    {        var client = new WebClient();        var data = client.DownloadData(new Uri("…"));        //...        return View();    }}

ASP.NET MVC 3 – kontroler

Potencjalnie długotrwała operacja

Page 35: Asynchroniczność w Windows 8

public class HomeController : AsyncController{    public void DownloadAsync()    {        AsyncManager.OutstandingOperations.Increment();        var client = new WebClient();        client.DownloadDataCompleted += (s, a) =>            {                AsyncManager.Parameters["data"] = a.Result;                AsyncManager.OutstandingOperations.Decrement();            };        client.DownloadDataAsync(new Uri("…"));    }     public ActionResult AvatarDetailsCompleted(byte[] data)    {        //...        return View();    }}

ASP.NET MVC 3 – kontroler asynchroniczny

Page 36: Asynchroniczność w Windows 8

ASP.NET MVC 3

Kontroler synchroniczny

Kontroler asynchroniczny

Demo

Page 37: Asynchroniczność w Windows 8

public class HomeController : Controller{    public ActionResult Download()    {        var client = new WebClient();        var data = client.DownloadData(new Uri("…"));        //...        return View();    }}

ASP.NET MVC 4 – kontroler synchroniczny(przypomnienie)

Page 38: Asynchroniczność w Windows 8

public class HomeController : AsyncController{    public async Task<ActionResult> Download()    {        var client = new WebClient();        var data = await client.DownloadDataTaskAsync(/*…*/);        //...        return View();    }}

ASP.NET MVC 4 – kontroler asynchroniczny

Page 39: Asynchroniczność w Windows 8

ASP.NET MVC 4

Kontroler asynchroniczny

Demo

Page 40: Asynchroniczność w Windows 8

Windows Runtimeasync

Page 41: Asynchroniczność w Windows 8

Async w Windows Runtime

FundamentalsAuthentication Cryptography Globalization .NET Win32App Lifetime

Communications & Data

Contracts XML Web

Networking Notifications

Local & Cloud StorageMediaCapture

PlayTo

Devices

Sensors

GeolocationPortable Devices

NFC

User InterfaceHTML5 / CSS XAML DirectX Controls

Input Accessibility Printing

Data Binding

Tiles

Streams

Background Transfer

SVG

AtomPub

SMS

Printer

Visual Effects

Transcoding

Page 42: Asynchroniczność w Windows 8

Asynchroniczność w Windows Runtime

Demo

Page 43: Asynchroniczność w Windows 8

Async w Windows Runtime

Page 44: Asynchroniczność w Windows 8

IAsync* a Task

IAsyncAction

IAsyncOperation<TResult>

Task

Task<TResult>

Page 45: Asynchroniczność w Windows 8

Internals, architektura

Page 46: Asynchroniczność w Windows 8

Na jakim wątku wykona się dalej kod?

Demo

Page 47: Asynchroniczność w Windows 8

Czy skoro można wywołać na: Task IAsyncAction/Operation

to czy można wywołać na czymś jeszcze innym?

Pytanie

Page 48: Asynchroniczność w Windows 8

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

Page 49: Asynchroniczność w Windows 8

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; } });

Page 50: Asynchroniczność w Windows 8

await a Exception

Demo

Page 51: Asynchroniczność w Windows 8

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?

Page 52: Asynchroniczność w Windows 8

Wzorce, np. MVVM? Warstwy: logiki biznesowej, dostępu do danych?

Co z tą architekturą?

Page 53: Asynchroniczność w Windows 8

Wpływ async na architekturę

Demo

Page 54: Asynchroniczność w Windows 8

async – okiełznanie asynchroniczności

W .NET – nowe metody W Windows Runtime – jedyny model Pełne wsparcie w ASP.NET, WCF Wpływ na architekturę

Podsumowanie

Page 55: Asynchroniczność w Windows 8

Dziękuję za uwagę!Pytania?