Asynchroniczność w Windows 8

Post on 24-Feb-2016

47 views 0 download

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

Asynchroniczność w Windows 8Jakub Binkowski

O mnie

Jakub Binkowski

2008 - 2011

Lead .NET Developer

Agenda

Dlaczego asynchronicz-ność?

Historia:APM, EAP async i await

ASP.NET MVCWindows 8 Runtime

Internals i architektura

Dlaczego asynchroniczność?

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

Gdyby 1 cykl procesora = 1 sekunda:

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

Ile to trwa?

Operacje obliczeniowe

Wątek

Operacje I/O synchroniczne

Operacja I/O

Wątek

Urządzenie

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

Aplikacje desktop (Metro, WPF, …)

Aplikacje serwerowe (ASP.NET, WCF, …)

Problemy

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

odpowiadać

Aplikacje desktop

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

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

Przykład – aplikacja ASP.NET

HTML DBWeb

ServiceHTML HTML

CPU = 66%

DB

Żądania aktualnie obsługiwaneKolejka żądań

oczekujących

HTML

Przykład – aplikacja ASP.NET

HTML DBWeb

ServiceHTML

CPU = 33%

DBHTML

Przykład – aplikacja ASP.NET

HTML DBWeb

Service

CPU = 0%

DBHTML

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

Desktop „zawieszenie się”

Server spadek wydajności

Rozwiązanie – operacje asynchroniczne

Problemy operacji synchronicznych

Operacje I/O asynchroniczne

Operacja I/O

Wątek 1

Urządzenie

Wątek 2

Krótka historia asynchroniczności w .NET

Asynchronous Programming Model

Asynchroniczność w .NET 1.1

Demo

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

Asynchronous Programming Model

Event-base Asynchronous Programming

Asynchroniczność w .NET 2.0

Demo

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…

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…

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…

A gdyby tak można było…

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!

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

Jak działa async?

async

Demo

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.

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!

ASP.NET MVCasync

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

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

ASP.NET MVC 3

Kontroler synchroniczny

Kontroler asynchroniczny

Demo

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)

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

ASP.NET MVC 4

Kontroler asynchroniczny

Demo

Windows Runtimeasync

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

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 Pełne wsparcie w ASP.NET, WCF Wpływ na architekturę

Podsumowanie

Dziękuję za uwagę!Pytania?