Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałRacław Dolecki Został zmieniony 10 lat temu
1
Asynchroniczność w Windows 8 Jakub Binkowski
2
O mnie Jakub Binkowski 2008 - 2011 Lead.NET Developer
3
Agenda Dlaczego asynchronicz- ność? Historia: APM, EAPasync i await ASP.NET MVC Windows 8 Runtime Internals i architektura
4
Dlaczego asynchroniczność?
5
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
6
Gdyby 1 cykl procesora = 1 sekunda: Rejestr: 1s Pamięć: 5-10s Dysk: 3 miesiące Sieć: 30 lat Ile to trwa?
7
Operacje obliczeniowe Wątek
8
Operacje I/O synchroniczne Operacja I/O Wątek Urządzenie
9
Różne problemy w różnych środowiskach: Aplikacje desktop (Metro, WPF, …) Aplikacje serwerowe (ASP.NET, WCF, …) Problemy
10
Jest jeden wątek UI Gdy jest zajęty aplikacja przestaje odpowiadać Aplikacje desktop
11
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
12
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
13
HTML DB Web Service HTML CPU = 66% DB Żądania aktualnie obsługiwane Żądania aktualnie obsługiwane Kolejka żądań oczekujących Kolejka żądań oczekujących HTML
14
Przykład – aplikacja ASP.NET HTML DB Web Service HTML CPU = 33% DB HTML
15
Przykład – aplikacja ASP.NET HTML DB Web Service CPU = 0% DB HTML Żądania, które można by obsłużyć… Żądania, które można by obsłużyć…
16
Desktop zawieszenie się Server spadek wydajności Rozwiązanie – operacje asynchroniczne Problemy operacji synchronicznych
17
Operacje I/O asynchroniczne Operacja I/O Wątek 1 Urządzenie Wątek 2
18
Krótka historia asynchroniczności w.NET
19
Asynchronous Programming Model Asynchroniczność w.NET 1.1 Demo
20
Wg zespołu Windows Forms APM jest: zbyt skomplikowany nie pasuje do trybu design wymaga pilnowania wątków Asynchronous Programming Model
21
Event-base Asynchronous Programming Asynchroniczność w.NET 2.0 Demo
22
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…
23
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…
24
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…
25
A gdyby tak można było…
26
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!
27
public async Task DownloadFile(string url) { var wc = new WebClient(); var data = await wc.DownloadDataTaskAsync(/*...*/); //carry on... } Jak działa async?
28
async Demo
29
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?
30
public async void FireAndForget() { /*...*/ } public async Task FireAndRemember() { /*...*/ } public async Task FireAndReturn() { /*...*/ return 1; } Metody async
31
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()
32
Func > fireAndReturn = async ()=> { /**/ return 1; }; Anonimowy async? Czemu nie!
33
ASP.NET MVC async
34
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
35
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
36
ASP.NET MVC 3 Kontroler synchroniczny Kontroler asynchroniczn y Demo
37
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)
38
public class HomeController : AsyncController { public async Task Download() { var client = new WebClient(); var data = await client.DownloadDataTaskAsync(/*…*/); //... return View(); } } ASP.NET MVC 4 – kontroler asynchroniczny
39
ASP.NET MVC 4 Kontroler asynchroniczn y Demo
40
Windows Runtime async
41
Async w Windows Runtime Fundamentals Communications & Data Media Devices User Interface
42
Asynchroniczność w Windows Runtime Demo
43
Async w Windows Runtime
44
IAsync* a Task IAsyncAction IAsyncOperation Task
45
Internals, architektura
46
Na jakim wątku wykona się dalej kod? Demo
47
Czy skoro można wywołać na: Task IAsyncAction/Operation to czy można wywołać na czymś jeszcze innym? Pytanie
48
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
49
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; } });
50
await a Exception Demo
51
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?
52
Wzorce, np. MVVM? Warstwy: logiki biznesowej, dostępu do danych? Co z tą architekturą?
53
Wpływ async na architekturę Demo
54
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
55
Dziękuję za uwagę! Pytania?
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.