SlideShare a Scribd company logo
1 of 50
C# 5/Rx Extensions :Vers un développement asynchrone Giovanni ClementWygwam Eric Vernié Microsoft
Motivations
Point de rupture
La programmation parallèle est un art difficile
Example de code séquentiel (C#) for (int z = 0; z < nbandesReel; z++)  { intoffSetpositiony = (tailleBandeY) * (z);     a = xmin;    b = (ymin) + (intigralY * tailleBandeY) * z;    Bitmap bmp = DessinerBandeUnsafe(b,width ,tailleBandeY);                    Rectangle rect = new Rectangle(0, offSetpositiony, width, tailleBandeY); Gfx.DrawImage(bmp, rect); }            //Code omis pour plus de clarté
Code parallèle manuel ManualResetEventmre = new ManualResetEvent(false);                 ReaderWriterLockSlimlck = new ReaderWriterLockSlim();              int z = 0; int restant = nbandesReel;             for (z = 0; z < nbandesReel; z++)             {         param.b = (ymin) + (intigralY * tailleBandeY) * z; param.offSetpositiony = (tailleBandeY) * (z);  ThreadPool.QueueUserWorkItem((objectuserState) =>                 { Parametres p = (Parametres)userState;                     Bitmap bmp = this.DessinerBandeUnsafe(p.b, p.width, p.tailleBandeY);                                          Rectangle rect = new Rectangle(0, p.offSetpositiony, p.width, p.tailleBandeY); try                     { lck.EnterWriteLock();  Gfx.DrawImage(bmp, rect);                     } finally                     { lck.ExitWriteLock();                       }                     if (Interlocked.Decrement(ref restant) == 0) mre.Set();                                               }, param);             } mre.WaitOne();  SynchroSurMandelbrotComplete();         }
Il est donc urgent de simplifier !!
Microsoft nous aide avec la TaskParallel Library
TaskParallel Library (.NET) Chaque itération est une tâche Parallel.For(0, nbandesReel, 1, (z) =>   { intoffSetpositiony = (tailleBandeY) * (z);         b = (ymin) + (intigralY * tailleBandeY) * z;        Bitmap bmp = this.DessinerBandeUnsafe(b, width, tailleBandeY);        Rectangle rect = new Rectangle(0, offSetpositiony, width, tailleBandeY); this.SyncroDessinerFractal(new DessinerEventArgs(bmp, rect, true)); }); Toutes les tâches doivent êtres finies avant de poursuivre
Les Tasks en action
Penser Parallèle
L’offre parallèle de Visual Studio 2010 aujourd’hui
Nouvelle librairie TPL DataFlow
Pipeline Coordination orientée événements Modélisation orientée flux de données
Jeux de primitives (blocs) pour communiquer par message au sein d’un processus Penser “Mise en tampon + traitement” Construitau dessus des Tâches TPL, des collections concurrentes, … Les “Blocs Dataflow” peuvent êtres mis en liaisons pour créer des réseaux de communication Repose sur des concepts / designs provenant Dix ans d’expérience en recherche en informatique Inspiré d’implémentations Microsoft Asynchronous Agents librarydans Visual C++ 2010 CCR de Microsoft Robotics Introduction à TPL DataFlowNouvelle librairie orientée flux de données
Blocs de flux de données
Bloc pour stocker des donnéesBufferBlock<T> private var _buffer = newBufferBlock<int>();   private static void Producer() {     while(true)     { int item = Produce();         _buffer.Post(item);     }} private static asyncvoid ConsumerAsync() {     while(true)     { int item = await _buffer.ReceiveAsync();         Process(item);     } }
Bloc d’exécutionActionBlock<TInput> var actionWrite = new ActionBlock<int>(item => Console.WriteLine(item));var buffer = new BufferBlock<int>();buffer.LinkTo(actionWrite);for (int i = 0; i < 10; i++)    buffer.Post(i);
Bloc d’ExécutionTransformBlock<TInput,TOutput> var transformPow = new TransformBlock<double, double>(d => Math.Pow(d, 2));var transformSqrt = new TransformBlock<double, double>(d => Math.Sqrt(d));var actionWrite = new ActionBlock<double>(d => Console.WriteLine(d));transformPow.LinkTo(transformSqrt);transformSqrt.LinkTo(actionWrite);for (double d = 0; d < 10; d++)    transformPow.Post(d);
Bloc pour stocker des données BroadcastBlock<T> var broadcast = new BroadcastBlock<int>(_ => _);var buffer1 = new BufferBlock<int>();var buffer2 = new BufferBlock<int>();broadcast.LinkTo(buffer2);broadcast.LinkTo(buffer1);for (int i = 0; i < 10;  i++){    broadcast.Post(i);} for (int i = 0; i < 10;  i++){    Console.WriteLine("Buffer1 " +                  buffer1.Receive());    Console.WriteLine("Buffer2 " +                 buffer2.Receive());}
TPL DataFlow en action
Penser parallèle et structurer l’application doit donc devenir une seconde nature afin que l’application monte efficacement en charge.
Mais développer parallèle, ce n’est pas que la performance !!
C’est aussi l’asynchronisme
AsynchronousProgramming Model (APM) IAsyncResultBeginRead(byte[] array,intoffset,intnumBytes, AsyncCallbackuserCallback,objectstateObject) intEndRead(IAsyncResultasynResult) Event-basedAsynchronous Pattern (EAP) void SendAsync( IPAddress address, Object userToken ) pingSender.PingCompleted+= new PingCompletedEventHandler (PingCompletedCallback); Modèles existant
Task-basedAsynchronous Pattern (TAP) Task, et Task<Tresult> Nouvelles fonctionnalités du langage C# 5 async et await Reactive Extensions Nouveaux Modèles
TAP : Comment çamarche ? async Task<XElement> GetRssAsync(stringurl) { var client = newWebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }
async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text);     return xml; } TAP Comment çamarche ? Task<XElement> GetRssAsync(stringurl) { var $builder = AsyncMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $a1; Action $resume = delegate { try { if ($state == 1) goto L1; var client = newWebClient(); var task = client.DownloadStringTaskAsync(url);             $state = 1;             $a1 = task.GetAwaiter(); if ($a1.BeginAwait($resume)) return;         L1: var text = $a1.EndAwait(); var xml = XElement.Parse(text);             $builder.SetResult(xml);         } catch (Exception $ex) { $builder.SetException($ex); }     };     $resume(); return $builder.Task; }
TAP en action
[object Object]
await sur méthodes de TaskEx (Run ou AwaitAll)
TransformationTask<T> en T au retour de await
 Support de l’annulation
CancellationTokenSource
Gestion des exceptions
try/catch autour de await
OperationCanceledException pour annulationC# Async composition
Reactive Extension « Asynchronisme » Une tache est asynchrone, SSI son éxécution ne bloque pas le contexte applicatif dans lequel elle se trouve.
Reactive Extension Besoin d’une interface graphique fluide Consommation de services Applications connectées …
Reactive Extension Rx Extensions <-> Reactive Extensions Ensemble d’outils (extensions)  facilitant la gestions de taches / contextes asynchrones dans vos applications.
Reactive Extension ,[object Object]
Methodechaining : Nouveau context  Dernier context ,[object Object]
Ubiquitaire
Producer / Consumers d’events
 Finit les multitudes de callbacks a gérer,[object Object],[object Object]
Threading de la BCL (TPL)
Collections Threadsafe
Runtimeobjects,[object Object]
Reactive Extension Observable/Observer <T> ,[object Object]

More Related Content

What's hot

Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 
Ingénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesIngénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesDaniel Lemire
 
Traitement des données massives (INF442, A4)
Traitement des données massives (INF442, A4)Traitement des données massives (INF442, A4)
Traitement des données massives (INF442, A4)Frank Nielsen
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleGeeks Anonymes
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronestchappui
 
[Paris Unity3D meetup] - Système d’instancing dans endless legend reskin
[Paris Unity3D meetup] - Système d’instancing dans endless legend reskin[Paris Unity3D meetup] - Système d’instancing dans endless legend reskin
[Paris Unity3D meetup] - Système d’instancing dans endless legend reskinBeMyApp
 
Correction md2 fabien orienté object
Correction md2 fabien orienté objectCorrection md2 fabien orienté object
Correction md2 fabien orienté objectyahyaoui hamdi
 
Chapitre 4 récursivité
Chapitre 4 récursivitéChapitre 4 récursivité
Chapitre 4 récursivitéSana Aroussi
 
Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014SOAT
 
Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Amel Morchdi
 

What's hot (18)

Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
Ingénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnéesIngénierie de la performance au sein des mégadonnées
Ingénierie de la performance au sein des mégadonnées
 
Traitement des données massives (INF442, A4)
Traitement des données massives (INF442, A4)Traitement des données massives (INF442, A4)
Traitement des données massives (INF442, A4)
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
Récursivité
RécursivitéRécursivité
Récursivité
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
 
[Paris Unity3D meetup] - Système d’instancing dans endless legend reskin
[Paris Unity3D meetup] - Système d’instancing dans endless legend reskin[Paris Unity3D meetup] - Système d’instancing dans endless legend reskin
[Paris Unity3D meetup] - Système d’instancing dans endless legend reskin
 
DCT1 4SI
DCT1  4SIDCT1  4SI
DCT1 4SI
 
cours algorithme
cours algorithmecours algorithme
cours algorithme
 
Correction md2 fabien orienté object
Correction md2 fabien orienté objectCorrection md2 fabien orienté object
Correction md2 fabien orienté object
 
C++ 11/14
C++ 11/14C++ 11/14
C++ 11/14
 
Chapitre 4 récursivité
Chapitre 4 récursivitéChapitre 4 récursivité
Chapitre 4 récursivité
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
 
Résumer arithmétique
Résumer arithmétiqueRésumer arithmétique
Résumer arithmétique
 
Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014
 
C4 fonctions
C4 fonctionsC4 fonctions
C4 fonctions
 
Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++
 

Viewers also liked

HTML5 W3C Conference Euratechnologie
HTML5 W3C Conference EuratechnologieHTML5 W3C Conference Euratechnologie
HTML5 W3C Conference Euratechnologiewyggio
 
Wygday 2011 - Introduction à HTML5
Wygday 2011 - Introduction à HTML5Wygday 2011 - Introduction à HTML5
Wygday 2011 - Introduction à HTML5wyggio
 
Techdays 2012 - Développement Web Mobile avec Microsoft
Techdays 2012 - Développement Web Mobile avec MicrosoftTechdays 2012 - Développement Web Mobile avec Microsoft
Techdays 2012 - Développement Web Mobile avec Microsoftwyggio
 
Identification des menances portant sur les données
Identification des menances portant sur les donnéesIdentification des menances portant sur les données
Identification des menances portant sur les donnéesASPLENIUM
 
ICHEC - PME plus - Des aides pour entreprendre à Bruxelles
ICHEC - PME plus - Des aides pour entreprendre à BruxellesICHEC - PME plus - Des aides pour entreprendre à Bruxelles
ICHEC - PME plus - Des aides pour entreprendre à BruxellesAzaerts David
 
Chapter 5 l'ancien et la croissance eglise
Chapter 5 l'ancien et la croissance egliseChapter 5 l'ancien et la croissance eglise
Chapter 5 l'ancien et la croissance egliseGervaisson Pluviose
 
Diseño estructurado
Diseño estructuradoDiseño estructurado
Diseño estructuradoDascorp
 
Tec de la inf 10º 2014
Tec de la inf 10º 2014Tec de la inf 10º 2014
Tec de la inf 10º 2014iptchpanama
 
Arturo gomez jaramillo
Arturo gomez jaramilloArturo gomez jaramillo
Arturo gomez jaramilloSandra Zapata
 
El corazón delator
El corazón delatorEl corazón delator
El corazón delatorevejita93
 

Viewers also liked (20)

HTML5 W3C Conference Euratechnologie
HTML5 W3C Conference EuratechnologieHTML5 W3C Conference Euratechnologie
HTML5 W3C Conference Euratechnologie
 
Wygday 2011 - Introduction à HTML5
Wygday 2011 - Introduction à HTML5Wygday 2011 - Introduction à HTML5
Wygday 2011 - Introduction à HTML5
 
Techdays 2012 - Développement Web Mobile avec Microsoft
Techdays 2012 - Développement Web Mobile avec MicrosoftTechdays 2012 - Développement Web Mobile avec Microsoft
Techdays 2012 - Développement Web Mobile avec Microsoft
 
Identification des menances portant sur les données
Identification des menances portant sur les donnéesIdentification des menances portant sur les données
Identification des menances portant sur les données
 
Newsstand
NewsstandNewsstand
Newsstand
 
ICHEC - PME plus - Des aides pour entreprendre à Bruxelles
ICHEC - PME plus - Des aides pour entreprendre à BruxellesICHEC - PME plus - Des aides pour entreprendre à Bruxelles
ICHEC - PME plus - Des aides pour entreprendre à Bruxelles
 
2013_1_ciMedio_Tema6TrobesBibliografiaRecomendada
2013_1_ciMedio_Tema6TrobesBibliografiaRecomendada2013_1_ciMedio_Tema6TrobesBibliografiaRecomendada
2013_1_ciMedio_Tema6TrobesBibliografiaRecomendada
 
2014_1_ciAvanzTema4RecursosDinfEnLasBibliotecasUV
2014_1_ciAvanzTema4RecursosDinfEnLasBibliotecasUV2014_1_ciAvanzTema4RecursosDinfEnLasBibliotecasUV
2014_1_ciAvanzTema4RecursosDinfEnLasBibliotecasUV
 
Chapter 5 l'ancien et la croissance eglise
Chapter 5 l'ancien et la croissance egliseChapter 5 l'ancien et la croissance eglise
Chapter 5 l'ancien et la croissance eglise
 
El plagio
El plagioEl plagio
El plagio
 
Diseño estructurado
Diseño estructuradoDiseño estructurado
Diseño estructurado
 
2014_1_ciAvanzTema6_4TrobesAvanzEncontrarTesis
2014_1_ciAvanzTema6_4TrobesAvanzEncontrarTesis2014_1_ciAvanzTema6_4TrobesAvanzEncontrarTesis
2014_1_ciAvanzTema6_4TrobesAvanzEncontrarTesis
 
Tec de la inf 10º 2014
Tec de la inf 10º 2014Tec de la inf 10º 2014
Tec de la inf 10º 2014
 
ResearchTalks Vol.8 - La vision de Leaseplan des voitures de société et fisca...
ResearchTalks Vol.8 - La vision de Leaseplan des voitures de société et fisca...ResearchTalks Vol.8 - La vision de Leaseplan des voitures de société et fisca...
ResearchTalks Vol.8 - La vision de Leaseplan des voitures de société et fisca...
 
Arturo gomez jaramillo
Arturo gomez jaramilloArturo gomez jaramillo
Arturo gomez jaramillo
 
El corazón delator
El corazón delatorEl corazón delator
El corazón delator
 
2014_1_ciAvanzREP
2014_1_ciAvanzREP2014_1_ciAvanzREP
2014_1_ciAvanzREP
 
2014_1_ciAvanzBhaRila
2014_1_ciAvanzBhaRila2014_1_ciAvanzBhaRila
2014_1_ciAvanzBhaRila
 
Londres
LondresLondres
Londres
 
LLBA spa
LLBA spaLLBA spa
LLBA spa
 

Similar to Wygday 2011 - C#5 Async CTP - Reactive Extensions

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
Ch8 correction exercices (1)
Ch8 correction exercices (1)Ch8 correction exercices (1)
Ch8 correction exercices (1)abdellah12
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdfPatiento Del Mar
 
3 vb reference
3 vb reference3 vb reference
3 vb referencekkatia31
 
TP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent PerceptionTP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent PerceptionSaid Benaissa
 
Projet base de donnée
Projet base de donnée Projet base de donnée
Projet base de donnée MakremArfaoui2
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Découvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDécouvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDotNetHub
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystMathieu Goeminne
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Ruau Mickael
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech daysJean-Pierre Vincent
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptMicrosoft
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
Pré projet thèse "VILLE AGILE ET AGILITÉ URBAINE : VERS UN NOUVEAU DESIGN M...
Pré projet thèse "VILLE AGILE ET AGILITÉ URBAINE : VERS UN NOUVEAU DESIGN M...Pré projet thèse "VILLE AGILE ET AGILITÉ URBAINE : VERS UN NOUVEAU DESIGN M...
Pré projet thèse "VILLE AGILE ET AGILITÉ URBAINE : VERS UN NOUVEAU DESIGN M...François-Florimond FLUCK
 

Similar to Wygday 2011 - C#5 Async CTP - Reactive Extensions (20)

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Dijkstra kshortest
Dijkstra kshortestDijkstra kshortest
Dijkstra kshortest
 
Ch8 correction exercices (1)
Ch8 correction exercices (1)Ch8 correction exercices (1)
Ch8 correction exercices (1)
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
3 vb reference
3 vb reference3 vb reference
3 vb reference
 
Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 
TP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent PerceptionTP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent Perception
 
Projet base de donnée
Projet base de donnée Projet base de donnée
Projet base de donnée
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Spring Batch
Spring BatchSpring Batch
Spring Batch
 
Découvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCLDécouvrez C# 4.0 et les améliorations apportées à la BCL
Découvrez C# 4.0 et les améliorations apportées à la BCL
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et Catalyst
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech days
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
Pré projet thèse "VILLE AGILE ET AGILITÉ URBAINE : VERS UN NOUVEAU DESIGN M...
Pré projet thèse "VILLE AGILE ET AGILITÉ URBAINE : VERS UN NOUVEAU DESIGN M...Pré projet thèse "VILLE AGILE ET AGILITÉ URBAINE : VERS UN NOUVEAU DESIGN M...
Pré projet thèse "VILLE AGILE ET AGILITÉ URBAINE : VERS UN NOUVEAU DESIGN M...
 

Wygday 2011 - C#5 Async CTP - Reactive Extensions

  • 1. C# 5/Rx Extensions :Vers un développement asynchrone Giovanni ClementWygwam Eric Vernié Microsoft
  • 3.
  • 5. La programmation parallèle est un art difficile
  • 6. Example de code séquentiel (C#) for (int z = 0; z < nbandesReel; z++) { intoffSetpositiony = (tailleBandeY) * (z); a = xmin; b = (ymin) + (intigralY * tailleBandeY) * z; Bitmap bmp = DessinerBandeUnsafe(b,width ,tailleBandeY); Rectangle rect = new Rectangle(0, offSetpositiony, width, tailleBandeY); Gfx.DrawImage(bmp, rect); } //Code omis pour plus de clarté
  • 7. Code parallèle manuel ManualResetEventmre = new ManualResetEvent(false); ReaderWriterLockSlimlck = new ReaderWriterLockSlim(); int z = 0; int restant = nbandesReel; for (z = 0; z < nbandesReel; z++) { param.b = (ymin) + (intigralY * tailleBandeY) * z; param.offSetpositiony = (tailleBandeY) * (z); ThreadPool.QueueUserWorkItem((objectuserState) => { Parametres p = (Parametres)userState; Bitmap bmp = this.DessinerBandeUnsafe(p.b, p.width, p.tailleBandeY); Rectangle rect = new Rectangle(0, p.offSetpositiony, p.width, p.tailleBandeY); try { lck.EnterWriteLock(); Gfx.DrawImage(bmp, rect); } finally { lck.ExitWriteLock(); } if (Interlocked.Decrement(ref restant) == 0) mre.Set(); }, param); } mre.WaitOne(); SynchroSurMandelbrotComplete(); }
  • 8. Il est donc urgent de simplifier !!
  • 9. Microsoft nous aide avec la TaskParallel Library
  • 10. TaskParallel Library (.NET) Chaque itération est une tâche Parallel.For(0, nbandesReel, 1, (z) => { intoffSetpositiony = (tailleBandeY) * (z); b = (ymin) + (intigralY * tailleBandeY) * z; Bitmap bmp = this.DessinerBandeUnsafe(b, width, tailleBandeY); Rectangle rect = new Rectangle(0, offSetpositiony, width, tailleBandeY); this.SyncroDessinerFractal(new DessinerEventArgs(bmp, rect, true)); }); Toutes les tâches doivent êtres finies avant de poursuivre
  • 11. Les Tasks en action
  • 13. L’offre parallèle de Visual Studio 2010 aujourd’hui
  • 15. Pipeline Coordination orientée événements Modélisation orientée flux de données
  • 16. Jeux de primitives (blocs) pour communiquer par message au sein d’un processus Penser “Mise en tampon + traitement” Construitau dessus des Tâches TPL, des collections concurrentes, … Les “Blocs Dataflow” peuvent êtres mis en liaisons pour créer des réseaux de communication Repose sur des concepts / designs provenant Dix ans d’expérience en recherche en informatique Inspiré d’implémentations Microsoft Asynchronous Agents librarydans Visual C++ 2010 CCR de Microsoft Robotics Introduction à TPL DataFlowNouvelle librairie orientée flux de données
  • 17. Blocs de flux de données
  • 18. Bloc pour stocker des donnéesBufferBlock<T> private var _buffer = newBufferBlock<int>();   private static void Producer() { while(true) { int item = Produce(); _buffer.Post(item); }} private static asyncvoid ConsumerAsync() { while(true) { int item = await _buffer.ReceiveAsync(); Process(item); } }
  • 19. Bloc d’exécutionActionBlock<TInput> var actionWrite = new ActionBlock<int>(item => Console.WriteLine(item));var buffer = new BufferBlock<int>();buffer.LinkTo(actionWrite);for (int i = 0; i < 10; i++)    buffer.Post(i);
  • 20. Bloc d’ExécutionTransformBlock<TInput,TOutput> var transformPow = new TransformBlock<double, double>(d => Math.Pow(d, 2));var transformSqrt = new TransformBlock<double, double>(d => Math.Sqrt(d));var actionWrite = new ActionBlock<double>(d => Console.WriteLine(d));transformPow.LinkTo(transformSqrt);transformSqrt.LinkTo(actionWrite);for (double d = 0; d < 10; d++)    transformPow.Post(d);
  • 21. Bloc pour stocker des données BroadcastBlock<T> var broadcast = new BroadcastBlock<int>(_ => _);var buffer1 = new BufferBlock<int>();var buffer2 = new BufferBlock<int>();broadcast.LinkTo(buffer2);broadcast.LinkTo(buffer1);for (int i = 0; i < 10;  i++){    broadcast.Post(i);} for (int i = 0; i < 10;  i++){    Console.WriteLine("Buffer1 " +  buffer1.Receive());    Console.WriteLine("Buffer2 " +  buffer2.Receive());}
  • 22. TPL DataFlow en action
  • 23. Penser parallèle et structurer l’application doit donc devenir une seconde nature afin que l’application monte efficacement en charge.
  • 24. Mais développer parallèle, ce n’est pas que la performance !!
  • 26. AsynchronousProgramming Model (APM) IAsyncResultBeginRead(byte[] array,intoffset,intnumBytes, AsyncCallbackuserCallback,objectstateObject) intEndRead(IAsyncResultasynResult) Event-basedAsynchronous Pattern (EAP) void SendAsync( IPAddress address, Object userToken ) pingSender.PingCompleted+= new PingCompletedEventHandler (PingCompletedCallback); Modèles existant
  • 27. Task-basedAsynchronous Pattern (TAP) Task, et Task<Tresult> Nouvelles fonctionnalités du langage C# 5 async et await Reactive Extensions Nouveaux Modèles
  • 28. TAP : Comment çamarche ? async Task<XElement> GetRssAsync(stringurl) { var client = newWebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; }
  • 29. async Task<XElement> GetRssAsync(string url) { var client = new WebClient(); var task = client.DownloadStringTaskAsync(url); var text = await task; var xml = XElement.Parse(text); return xml; } TAP Comment çamarche ? Task<XElement> GetRssAsync(stringurl) { var $builder = AsyncMethodBuilder<XElement>.Create(); var $state = 0; TaskAwaiter<string> $a1; Action $resume = delegate { try { if ($state == 1) goto L1; var client = newWebClient(); var task = client.DownloadStringTaskAsync(url); $state = 1; $a1 = task.GetAwaiter(); if ($a1.BeginAwait($resume)) return; L1: var text = $a1.EndAwait(); var xml = XElement.Parse(text); $builder.SetResult(xml); } catch (Exception $ex) { $builder.SetException($ex); } }; $resume(); return $builder.Task; }
  • 31.
  • 32. await sur méthodes de TaskEx (Run ou AwaitAll)
  • 33. TransformationTask<T> en T au retour de await
  • 34. Support de l’annulation
  • 39. Reactive Extension « Asynchronisme » Une tache est asynchrone, SSI son éxécution ne bloque pas le contexte applicatif dans lequel elle se trouve.
  • 40. Reactive Extension Besoin d’une interface graphique fluide Consommation de services Applications connectées …
  • 41. Reactive Extension Rx Extensions <-> Reactive Extensions Ensemble d’outils (extensions) facilitant la gestions de taches / contextes asynchrones dans vos applications.
  • 42.
  • 43.
  • 45. Producer / Consumers d’events
  • 46.
  • 47. Threading de la BCL (TPL)
  • 49.
  • 50.
  • 51.
  • 52.
  • 53. La séquence est envoyée vers les souscriptions
  • 54. A chaque donnée de séquence, le delegate reçoit l’item typé => C’est à vous d’y placer une logique.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60. Une source Observable<T> peut être « publiée » vers des consommateurs.
  • 61.
  • 62. 3 souscriptions dans l’application :
  • 63. L’onglet News de l’application
  • 66.
  • 67. Facilite et simplifie l’écriture d’applications asynchrones ( WinForms, WPF, WPhone7…)
  • 68.
  • 69. RxExtensions http://msdn.microsoft.com/en-us/data/gg577609 Introduction http://msdn.microsoft.com/en-us/data/gg577611 Samples http://rxwiki.wikidot.com/101samples Ressources

Editor's Notes

  1. Avec l’arrivée de Windows 7 64 Bits et de Windows 2008 R2 Plus sérieusement,Montrer les cores sur ma machines
  2. On eleve le niveaud’abstraction du thread aux tasks, et aux algos de plus haut niveaucomme le parallel.For
  3. MPE
  4. MPE