Krótka historia asynchroniczności w.NET 1-4.5 Jakub Binkowski.

Slides:



Advertisements
Podobne prezentacje
Copyright © The OWASP Foundation Permission is granted to copy, distribute and/or modify this document under the terms of the OWASP License. The OWASP.
Advertisements

Analiza wywołania i przebiegu przerwań w systemie Linux
tworzenie połączeń sieciowych
Java Server Faces Tomasz Nowak.
ALLEGRO PIERWSZA GRA: WYŚCIG
Java vs C# Michał Prządka Tomasz Nowak
Tworzenie ASP.NET Web Form
GUI Struktury Spotkanie integracyjne Nazwa wydziału: EAIiE Nazwa katedry: Informatyka Miejsce i data prezentacji: Kraków,
Testowanie oprogramowania metodą badania pokrycia kodu
.NET Remoting Łukasz Zawadzki.
Łukasz Monkiewicz.
142 JAVA – sterowanie i wątki public class A20 extends javax.swing.JApplet implements ActionListener { private int licznik = 0; private JTextField t =
Aplikacje sieciowe Obiekty typu Socket. ServerSocket ClientSocket Socket ClientSocket Socket.
Warstwy aplikacji sieciowych
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Tworzenie aplikacji sieciowych w języku Java Networking Prezentacja.
MS SQL SERVER udział w rynku. Source: Gartner Dataquest (May 2006) Company Market Share (%) Market Share (%) Growth (%) Oracle6, ,
MS ASP.NET 2005/2006
Drukarki w Windows 7/Windows Server 2008 R2
Tadeusz Janasiewicz IT Group, Tadeusz Janasiewicz, WSUS, IT Group, r.
Jakub Binkowski Visual C# MVP webEFS sp.j.. GET i POST.
Test Doubles Adam Gabryś , v1.1,
Zastosowanie frameworka Kendo UI w aplikacjach ASP.NET MVC
Najpopularniejsze aplikacje ASP.NET i PHP.
Aplikacje Internetowe
Witold Bołt Wprowadzenie do .NET Witold Bołt
Programowanie równoległe Wojciech Grześkowiak2010/11/12.
Node.js – Serverside Javascript
Parallel Extension czyli programowanie równoległe != współbieżne na platformie .NET Framework 4.0 Wojciech Grześkowiak
REKURENCJA.
Zrozumieć Umbraco w 45 minut.
Download the latest version at This message wont show up when youre presenting Windows Phone 7.
Dr inż. Piotr Czapiewski. Overloading Znaczenie inne niż w większości języków obiektowych Metoda dynamicznego tworzenia pól i metod Magiczne metody.
Krzysztof Manuszewski
Zarządzanie magazynem danych - Storage Spaces w Windows Server 2012 oraz w Windows 8 Błażej Miśkiewicz MCTMCP MCSA MCTS MCITP.
Damian Wojdan Kraków,
Asynchroniczność w Windows 8 Jakub Binkowski. O mnie Jakub Binkowski Lead.NET Developer.
ASP.NET Dynamic Data Jakub Binkowski Jakub Binkowski Visual C# MVP
1 © 2006 Cisco Systems, Inc. All rights reserved.SEC Agenda Cisco Business Partner Wymogi bezpieczeństwa współczesnej architektury sieciowej CISCO Self-Defending.
db4o Kacper Skory Marcin Talarek
Wirtualna przestrzeń eLearningowa (iCamp case) Jan Kusiak, Anna Danielewska-Tułecka, Dariusz Górka Centrum e-Learningu Akademia Górniczo-Hutnicza.
PIO 2_2, Zofia Kruczkiewicz1 Wykład 2 – część druga Iteracyjno-rozwojowy cykl oprogramowania 2.
PIO. Autor -Zofia Kruczkiewicz1 Wykład 1-część druga Wstęp do inżynierii oprogramowania. Cykle rozwoju oprogramowania (część biznesowa aplikacji) iteracyjno-rozwojowy.
Zend Framework Framework php Antonczak Lukasz. Dlaczego Zend Framework Zend Framework jest frameworkiem dla PHP5 rozwijanym przez społeczność użytkowników.
ALGORYTM.
Adam Suwała DIY - DI.
Cz.8 Zdarzenia. Refleksja – przypomnienie Event Programowanie zdarzeniowe Do dzieła!
Wprowadzenie do Reactive eXtensions dla .NET (RX)
System Center Summit Poland Sponsorzy Złoty Sponsor Srebrni Sponsorzy.
Automatyzacja testów akceptacyjnych
Powrót do sukcesu Analiza przypadku Princessy (rola badań marketingowych podczas rozwoju produktu: ) Powrót do sukcesu Analiza przypadku Princessy.
ZAGADKOWA NIEDZIELA AUDYCJA PROGRAMU TRZECIEGO POLSKIEGO RADIA Cezary Rubin Gimnazjum im. Adama Mickiewicza w Brodach, kl. I A.
Warsztaty C# Część 2 Grzegorz Piotrowski Grupa.NET PO
KINECT – czyli z czym to się je?. Damian Zawada
Procesy i wątki dla dociekliwych
Wykład 6 Programowanie systemowe w Linux: Wątki i ich synchronizacja
Technologie Programowania seminarium
dla programistów Windows Phone
TROCHĘ HISTORII Marek Zając PO CO UŻYWAĆ OPENCL? Marek Zając.
Silverlight 4 dla Windows Phone 7
1.
W ARSZTAT DO SZKOLENIA MS10264 D EVELOPING W EB A PPLICATIONS WITH M ICROSOFT V ISUAL S TUDIO 2010 Michał Kuciapski.
Poznań, , Artur Otrzonsek
Wydział Elektroniki Kierunek: AiR Zaawansowane metody programowania Wykład 6.
Responsywne aplikacje w Windows 8 i.NET 4.5 Jakub Binkowski.
U innych działa ;( Debuggowanie startu aplikacji Arkadiusz Kocjan.
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Technologie internetowe i mobilne
Pierwsza aplikacja na Windows Phone. Dlaczego Windows Phone?
Dynamics 365 CE i język TypeScript
Previously discusses: different kinds of variables
Zapis prezentacji:

Krótka historia asynchroniczności w.NET Jakub Binkowski

O mnie Jakub Binkowski Senior.NET Rule Financial Microsoft MVP w latach MCP, MCTS, MCPD Lider Łódzkiej Grupy Profesjonalistów IT &.NET

Agenda Dlaczego asynchroniczność? Jak? Asynchronous Programming Model (APM) Event-based Asynchronous Pattern (EAP) Task-based Asynchronous Pattern (TAP) Async i await w.NET 4.5 Asynchroniczny ASP.NET Testy jednostkowe

Dlaczego asynchroniczność?

Przypomnienie: Wątek jest drogi Pamięć: ponad 1MB (pamięć zarezerwowana) Czas: Powiadomienia o utworzeniu i zamknięciu wątku (do wszystkich DLL) Przełączenia kontekstu

Przypomnienie: Pula wątków Zbiór wątków dostępnych dla aplikacji Jedna na proces (CLR) Ilość wątków w puli Minimalna ilość wątków = ilość procesorów logicznych Maksymalna – zależy od środowiska Algorytm – czarna skrzynka Klasa ThreadPool

Przykład 1 – ASP.NET

public ActionResult AvatarDetails() { var url = " var data = new WebClient().DownloadData(url); var bitmap = new Bitmap(new MemoryStream(data)); var model = new AvatarModel { AvatarUrl = url, Size = data.Length, Width = bitmap.Width, Height = bitmap.Height }; return View(model); }

Gdzie jest problem? Pula wątków obsługujących żądania Dla uproszczenia – pula = 3 wątki; 3 procesory HTML DB Web Service HTML CPU = 66% Web Service

Gdzie jest problem? Pula wątków obsługujących żądania Dla uproszczenia – pula = 3 wątki; 3 procesory HTML DB Web Service CPU = 33% Web Service HTML

Gdzie jest problem? Pula wątków obsługujących żądania Dla uproszczenia – pula = 3 wątki; 3 procesory HTML DB Web Service CPU = 0% Web Service HTML !

Operacje obliczeniowe Wątek

Operacje I/O (synchroniczne) Operacja I/O Wątek Urządzenie

Gdyby… 1 cykl procesora = 1 sekunda: Rejestr: 1s Pamięć: 5-10s Dysk: 3 miesiące Sieć: 30 lat

Przykład 2 - WPF

void Button_Click(object sender, RoutedEventArgs e) { var data = new WebClient().DownloadData(tbUrl.Text); var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.StreamSource = new MemoryStream(data); bitmap.EndInit(); imgAvatar.Source = bitmap; } Uwaga! Brzydki kod Uwaga! Brzydki kod

Przykład 2 – WPF (aplikacja desktop) Tylko jeden wątek obsługuje UI W czasie wykonywania operacji aplikacja nie odpowiada

Programowanie synchroniczne Problemy Problem 1: Pula wątków blokowana przez zewnętrzne urządzenia (I/O) Problem 2: Wątek UI zajęty przez długotrwałą operację

Wzorce asynchroniczne APM vs EAP vs TAP

Kod synchroniczny API: public interface IMyType { int DoSomething(int a); } Wywołanie: IMyType type = /*..*/; int result = type.DoSomething(10);

Asynchronous Programming Model API public interface IMyType { IAsyncResult BeginDoSomething(int a, AsyncCallback callback, object state); int EndDoSomething(IAsyncResult asyncResult); }

Asynchronous Programming Model Użycie – wariant 1 IMyType type = /*..*/; IAsyncResult asyncRes = type.BeginDoSomething(10, null, null); //... int result = type.EndDoSomething(asyncRes); //...

Asynchronous Programming Model Użycie – wariant 2 class MyProgram { private IMyType _type; public void Begin() { _type.BeginDoSomething(10, OnDoSomethingFinished, null); } private void OnDoSomethingFinished(IAsyncResult asyncRes) { int result = _type.EndDoSomething(asyncRes); //... }

Asynchronous Programming Model Użycie – wariant 2b IMyType type = /*..*/; type.BeginDoSomething(10, asyncRes => { int result = type.EndDoSomething(asyncRes); //... }, null);

Demo Asynchronous Programming Model

Trochę historii Oryginalnie IAsyncResult jedynym wzorcem Wg zespołu Windows Forms IAsyncResult jest zbyt skomplikowany nie pasuje do trybu design wymaga pilnowania wątków Efekt – alternatywne podejście: Event-base Asynchronous Programming

Event-based Asynchronous Programming API public interface IMyType { void DoSomethingAsync(int a); event DoSomethingCompletedEventHandler DoSomethingCompleted; } public class DoSomethingCompletedEventArgs: AsyncCompletedEventArgs { public int Result { get; set; } /*…*/ } public delegate void DoSomethingCompletedEventHandler( object sender, DoSomethingCompletedEventArgs args);

Event-based Asynchronous Programming Użycie IMyType type = /*...*/; type.DoSomethingCompleted += (sender, args) => { int result = args.Result; //... }; type.DoSomethingAsync(10);

Demo Event-based Asynchronous Programming

APM Zastosowanie FCL: 60 klas Strumienie ( System.IO.Stream ) DNS ( System.Net.Dns ) Gniazda sieciowe ( System.Net.Sockets.Socket ) Żądania sieciowe ( System.Net.WebRequest ) Polecenia SQL ( System.Data.SqlClient.SqlCommand ) Porty ( System.IO.Ports.SerialPort ) Web/Service References

EAP Zastosowanie FCL: 17 klas System.ComponentModel.BackgroundWorker; System.Net.WebClient; System.Net.NetworkInformation.Ping; System.Windows.Forms.PictureBox; System.Net.Mail.SmtpClient; i inne…

APM czy EAP?

Gdzie jest problem?

Gdzie jest problem?

W drodze ku lepszemu.NET 4.0 wprowadził nowy model programowania równoległego – Task Parallel Library C# 4.5 wprowadzi nowy model programowania asynchronicznego: Task-based Asynchronous Programming APM i EAP staną się przestarzałe

Idea TAP Niech deweloperzy piszą kod prawie tak samo Magią niech zajmie się kompilator

Task-based Asynchronous Programming API public interface IMyType { Task DoSomethingTask(int a); }

Task-based Asynchronous Programming API public interface IMyType { Task DoSomethingTask(int a); }

Task-based Asynchronous Programming Użycie public async Task IsSomethingZeroAsync(int a) { IMyType type = /*...*/; var value = await type.DoSomethingAsync(a); return value == 0; }

Task-based Asynchronous Programming Użycie public async Task IsSomethingZeroAsync(int a) { IMyType type = /*...*/; var value = await type.DoSomethingAsync(a); return value == 0; }

Task-based Asynchronous Programming Użycie public async Task IsSomethingZeroAsync(int a) { IMyType type = /*...*/; var value = await type.DoSomethingAsync(a); return value == 0; }

Task-based Asynchronous Programming Użycie public async Task IsSomethingZeroAsync(int a) { IMyType type = /*...*/; var value = await type.DoSomethingAsync(a); return value == 0; }

Demo Task-based Asynchronous Programming

ASP.NET Asynchroniczne ASP.NET MVC 3 i 4

Demo ASP.NET MVC 3

Synchroniczny kontroler ASP.NET MVC 3 public class HomeController : Controller { public ActionResult AvatarDetails() { var client = new WebClient(); var data = client.DownloadData(new Uri("…")); //... return View(); } }

Asynchroniczny kontroler ASP.NET MVC 3 public class HomeController : AsyncController { public void AvatarDetailsAsync() { 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(); } }

Asynchroniczny kontroler ASP.NET MVC 3 public class HomeController : AsyncController { public void AvatarDetailsAsync() { 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(); } }

Asynchroniczny kontroler ASP.NET MVC 3 public class HomeController : AsyncController { public void AvatarDetailsAsync() { 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(); } }

Asynchroniczny kontroler ASP.NET MVC 3 public class HomeController : AsyncController { public void AvatarDetailsAsync() { 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(); } }

Demo ASP.NET MVC 4 + async

Synchroniczny kontroler ASP.NET MVC 4 public class HomeController : Controller { public ActionResult AvatarDetails() { var client = new WebClient(); var data = client.DownloadData(new Uri("…")); //... return View(); } }

Asynchroniczny kontroler ASP.NET MVC 4 public class HomeController : AsyncController { public async Task AvatarDetails() { var client = new WebClient(); var data = await client.DownloadDataTaskAsync(new Uri("…")); //... return View(); } }

Asynchroniczny kontroler ASP.NET MVC 4 public class HomeController : AsyncController { public async Task AvatarDetails() { var client = new WebClient(); var data = await client.DownloadDataTaskAsync(new Uri("…")); //... return View(); } }

Asynchroniczny kontroler ASP.NET MVC 4 public class HomeController : AsyncController { public async Task AvatarDetails() { var client = new WebClient(); var data = await client.DownloadDataTaskAsync(new Uri("…")); //... return View(); } }

async a testy jednostkowe

Demo Synchronous unit tests

Demo Asynchronous unit tests

Podsumowanie 3 wzorce programowania asynchronicznego: APM (Asynchronous Programming Model) EAP (Event-based Asynchronous Programming) TAP (Task-based Asynchronous Programming) TAP zastępuje APM i EAP nowe metody w całym.NET Framework wsparcie w ASP.NET wsparcie w WCF Potężne wsparcie kompilatora – async i await

Przydatne odnośniki Asynchronous programming design patterns: Asynchronous ASP.NET: Asynchronous WCF:

Przydatne odnośniki – async TAP in-depth: Visual Studio 11 CTP: aylang=en&id= aylang=en&id=27543 ASP.NET MVC 4 CTP: MVC4VS11&prerelease=true MVC4VS11&prerelease=true Jon Skeet blog:

Dziękuję za uwagę. Pytania?