C# 5/Rx Extensions :Vers un développement asynchrone<br />Giovanni ClementWygwam<br />Eric Vernié Microsoft<br />
Motivations<br />
Point de rupture<br />
La programmation parallèle est un art difficile<br />
Example de code séquentiel (C#)<br />for (int z = 0; z < nbandesReel; z++)<br /> {<br />intoffSetpositiony = (tailleBandeY...
Code parallèle manuel<br />ManualResetEventmre = new ManualResetEvent(false);                <br />ReaderWriterLockSlimlck...
Il est donc urgent de simplifier !!<br />
Microsoft nous aide avec la TaskParallel Library<br />
TaskParallel Library (.NET)<br />Chaque itération est une tâche<br />Parallel.For(0, nbandesReel, 1, (z) =><br />  {<br />...
Les Tasks en action<br />
Penser Parallèle<br />
L’offre parallèle de Visual Studio 2010 aujourd’hui<br />
Nouvelle librairie TPL DataFlow<br />
Pipeline<br />Coordination orientée événements<br />Modélisation orientée flux de données<br />
Jeux de primitives (blocs) pour communiquer par message au sein d’un processus<br />Penser “Mise en tampon + traitement”<b...
Blocs de flux de données<br />
Bloc pour stocker des donnéesBufferBlock<T><br />private var _buffer = newBufferBlock<int>();<br /> <br />private static v...
Bloc d’exécutionActionBlock<TInput><br />var actionWrite = new ActionBlock<int>(item => Console.WriteLine(item));var buffe...
Bloc d’ExécutionTransformBlock<TInput,TOutput><br />var transformPow = new TransformBlock<double, double>(d => Math.Pow(d,...
Bloc pour stocker des données BroadcastBlock<T><br />var broadcast = new BroadcastBlock<int>(_ => _);var buffer1 = new Buf...
TPL DataFlow en action<br />
Penser parallèle et structurer l’application doit donc devenir une seconde nature afin que l’application monte efficacemen...
Mais développer parallèle, ce n’est pas que la performance !!<br />
C’est aussi l’asynchronisme<br />
AsynchronousProgramming Model (APM)<br />IAsyncResultBeginRead(byte[] array,intoffset,intnumBytes, AsyncCallbackuserCallba...
Task-basedAsynchronous Pattern (TAP)<br />Task, et Task<Tresult><br />Nouvelles fonctionnalités du langage C# 5 async et a...
TAP : Comment çamarche ?<br />async Task<XElement> GetRssAsync(stringurl) {<br />var client = newWebClient();<br />var tas...
async Task<XElement> GetRssAsync(string url) {<br />var client = new WebClient();<br />var task = client.DownloadStringTas...
TAP en action<br />
<ul><li> Bonne intégration avec Tasks
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 annulation</li></ul>C# Async composition<br />
Reactive Extension<br />« Asynchronisme »<br />Une tache est asynchrone, SSI son éxécution ne bloque pas le contexte appli...
Reactive Extension<br />Besoin d’une interface graphique fluide<br />Consommation de services<br />Applications connectées...
Reactive Extension<br />Rx Extensions <-> Reactive Extensions<br />Ensemble d’outils (extensions)  facilitant la gestions ...
Reactive Extension<br /><ul><li>Fluent
Methodechaining : </li></ul>Nouveau context  Dernier context<br /><ul><li>Facilité de débugging
Ubiquitaire
Producer / Consumers d’events
 Finit les multitudes de callbacks a gérer</li></li></ul><li>Reactive Extension<br />Comment c’est fait ?<br /><ul><li>1 D...
Threading de la BCL (TPL)
Collections Threadsafe
Runtimeobjects</li></li></ul><li>Reactive Extension<br /> 2 Interfaces à retenir  :<br />IObserver<T><br />IObservable<T><...
Reactive Extension<br />Observable/Observer <T><br /><ul><li>Souscription
Prochain SlideShare
Chargement dans…5
×

Wygday 2011 - C#5 Async CTP - Reactive Extensions

3 648 vues

Publié le

Wygday - C#5 Async CTP - Reactive Extensions

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
3 648
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1 618
Actions
Partages
0
Téléchargements
21
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • Avec l’arrivée de Windows 7 64 Bits et de Windows 2008 R2 Plus sérieusement,Montrer les cores sur ma machines
  • On eleve le niveaud’abstraction du thread aux tasks, et aux algos de plus haut niveaucomme le parallel.For
  • MPE
  • MPE
  • Wygday 2011 - C#5 Async CTP - Reactive Extensions

    1. 1. C# 5/Rx Extensions :Vers un développement asynchrone<br />Giovanni ClementWygwam<br />Eric Vernié Microsoft<br />
    2. 2. Motivations<br />
    3. 3.
    4. 4. Point de rupture<br />
    5. 5. La programmation parallèle est un art difficile<br />
    6. 6. Example de code séquentiel (C#)<br />for (int z = 0; z < nbandesReel; z++)<br /> {<br />intoffSetpositiony = (tailleBandeY) * (z); <br /> a = xmin;<br /> b = (ymin) + (intigralY * tailleBandeY) * z;<br /> Bitmap bmp = DessinerBandeUnsafe(b,width ,tailleBandeY); <br /> Rectangle rect = new Rectangle(0, offSetpositiony, width, tailleBandeY);<br />Gfx.DrawImage(bmp, rect);<br />} <br />//Code omis pour plus de clarté<br />
    7. 7. Code parallèle manuel<br />ManualResetEventmre = new ManualResetEvent(false); <br />ReaderWriterLockSlimlck = new ReaderWriterLockSlim(); <br />int z = 0;<br />int restant = nbandesReel;<br /> for (z = 0; z < nbandesReel; z++)<br /> { <br />param.b = (ymin) + (intigralY * tailleBandeY) * z;<br />param.offSetpositiony = (tailleBandeY) * (z); <br />ThreadPool.QueueUserWorkItem((objectuserState) =><br /> {<br />Parametres p = (Parametres)userState;<br /> Bitmap bmp = this.DessinerBandeUnsafe(p.b, p.width, p.tailleBandeY); <br /> Rectangle rect = new Rectangle(0, p.offSetpositiony, p.width, p.tailleBandeY);<br />try<br /> {<br />lck.EnterWriteLock(); <br />Gfx.DrawImage(bmp, rect);<br /> }<br />finally<br /> {<br />lck.ExitWriteLock(); <br /> }<br /> if (Interlocked.Decrement(ref restant) == 0)<br />mre.Set(); <br /> }, param);<br /> }<br />mre.WaitOne(); <br />SynchroSurMandelbrotComplete();<br /> }<br />
    8. 8. Il est donc urgent de simplifier !!<br />
    9. 9. Microsoft nous aide avec la TaskParallel Library<br />
    10. 10. TaskParallel Library (.NET)<br />Chaque itération est une tâche<br />Parallel.For(0, nbandesReel, 1, (z) =><br /> {<br />intoffSetpositiony = (tailleBandeY) * (z); <br /> b = (ymin) + (intigralY * tailleBandeY) * z;<br /> Bitmap bmp = this.DessinerBandeUnsafe(b, width, tailleBandeY);<br /> Rectangle rect = new Rectangle(0, offSetpositiony, width, tailleBandeY);<br />this.SyncroDessinerFractal(new DessinerEventArgs(bmp, rect, true));<br />});<br />Toutes les tâches doivent êtres finies avant de poursuivre<br />
    11. 11. Les Tasks en action<br />
    12. 12. Penser Parallèle<br />
    13. 13. L’offre parallèle de Visual Studio 2010 aujourd’hui<br />
    14. 14. Nouvelle librairie TPL DataFlow<br />
    15. 15. Pipeline<br />Coordination orientée événements<br />Modélisation orientée flux de données<br />
    16. 16. Jeux de primitives (blocs) pour communiquer par message au sein d’un processus<br />Penser “Mise en tampon + traitement”<br />Construitau dessus des Tâches TPL, des collections concurrentes, …<br />Les “Blocs Dataflow” peuvent êtres mis en liaisons pour créer des réseaux de communication<br />Repose sur des concepts / designs provenant<br />Dix ans d’expérience en recherche en informatique<br />Inspiré d’implémentations Microsoft<br />Asynchronous Agents librarydans Visual C++ 2010<br />CCR de Microsoft Robotics<br />Introduction à TPL DataFlowNouvelle librairie orientée flux de données<br />
    17. 17. Blocs de flux de données<br />
    18. 18. Bloc pour stocker des donnéesBufferBlock<T><br />private var _buffer = newBufferBlock<int>();<br /> <br />private static void Producer()<br />{<br /> while(true)<br /> {<br />int item = Produce();<br /> _buffer.Post(item);<br /> }}<br />private static asyncvoid ConsumerAsync()<br />{<br /> while(true)<br /> {<br />int item = await _buffer.ReceiveAsync();<br /> Process(item);<br /> }<br />}<br />
    19. 19. Bloc d’exécutionActionBlock<TInput><br />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);<br />
    20. 20. Bloc d’ExécutionTransformBlock<TInput,TOutput><br />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);<br />
    21. 21. Bloc pour stocker des données BroadcastBlock<T><br />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);}<br />for (int i = 0; i < 10;  i++){    Console.WriteLine("Buffer1 " + <br /> buffer1.Receive());    Console.WriteLine("Buffer2 " + <br /> buffer2.Receive());}<br />
    22. 22. TPL DataFlow en action<br />
    23. 23. Penser parallèle et structurer l’application doit donc devenir une seconde nature afin que l’application monte efficacement en charge.<br />
    24. 24. Mais développer parallèle, ce n’est pas que la performance !!<br />
    25. 25. C’est aussi l’asynchronisme<br />
    26. 26. AsynchronousProgramming Model (APM)<br />IAsyncResultBeginRead(byte[] array,intoffset,intnumBytes, AsyncCallbackuserCallback,objectstateObject)<br />intEndRead(IAsyncResultasynResult)<br />Event-basedAsynchronous Pattern (EAP)<br />void SendAsync( IPAddress address, Object userToken )<br />pingSender.PingCompleted+= new PingCompletedEventHandler (PingCompletedCallback);<br />Modèles existant <br />
    27. 27. Task-basedAsynchronous Pattern (TAP)<br />Task, et Task<Tresult><br />Nouvelles fonctionnalités du langage C# 5 async et await<br />Reactive Extensions<br />Nouveaux Modèles<br />
    28. 28. TAP : Comment çamarche ?<br />async Task<XElement> GetRssAsync(stringurl) {<br />var client = newWebClient();<br />var task = client.DownloadStringTaskAsync(url);<br />var text = await task;<br />var xml = XElement.Parse(text);<br />return xml;<br />}<br />
    29. 29. async Task<XElement> GetRssAsync(string url) {<br />var client = new WebClient();<br />var task = client.DownloadStringTaskAsync(url);<br />var text = await task;<br />var xml = XElement.Parse(text);<br /> return xml;<br />}<br />TAP Comment çamarche ?<br />Task<XElement> GetRssAsync(stringurl) {<br />var $builder = AsyncMethodBuilder<XElement>.Create();<br />var $state = 0;<br />TaskAwaiter<string> $a1;<br />Action $resume = delegate {<br />try {<br />if ($state == 1) goto L1;<br />var client = newWebClient();<br />var task = client.DownloadStringTaskAsync(url);<br /> $state = 1;<br /> $a1 = task.GetAwaiter();<br />if ($a1.BeginAwait($resume)) return;<br /> L1: var text = $a1.EndAwait();<br />var xml = XElement.Parse(text);<br /> $builder.SetResult(xml);<br /> }<br />catch (Exception $ex) { $builder.SetException($ex); }<br /> };<br /> $resume();<br />return $builder.Task;<br />}<br />
    30. 30. TAP en action<br />
    31. 31. <ul><li> Bonne intégration avec Tasks
    32. 32. await sur méthodes de TaskEx (Run ou AwaitAll)
    33. 33. TransformationTask<T> en T au retour de await
    34. 34. Support de l’annulation
    35. 35. CancellationTokenSource
    36. 36. Gestion des exceptions
    37. 37. try/catch autour de await
    38. 38. OperationCanceledException pour annulation</li></ul>C# Async composition<br />
    39. 39. Reactive Extension<br />« Asynchronisme »<br />Une tache est asynchrone, SSI son éxécution ne bloque pas le contexte applicatif dans lequel elle se trouve.<br />
    40. 40. Reactive Extension<br />Besoin d’une interface graphique fluide<br />Consommation de services<br />Applications connectées … <br />
    41. 41. Reactive Extension<br />Rx Extensions <-> Reactive Extensions<br />Ensemble d’outils (extensions) facilitant la gestions de taches / contextes asynchrones dans vos applications.<br />
    42. 42. Reactive Extension<br /><ul><li>Fluent
    43. 43. Methodechaining : </li></ul>Nouveau context Dernier context<br /><ul><li>Facilité de débugging
    44. 44. Ubiquitaire
    45. 45. Producer / Consumers d’events
    46. 46. Finit les multitudes de callbacks a gérer</li></li></ul><li>Reactive Extension<br />Comment c’est fait ?<br /><ul><li>1 DLL principale : System.Reactive</li></li></ul><li>Reactive Extension<br />Comment c’est fait ?<br /><ul><li>Utilise :
    47. 47. Threading de la BCL (TPL)
    48. 48. Collections Threadsafe
    49. 49. Runtimeobjects</li></li></ul><li>Reactive Extension<br /> 2 Interfaces à retenir :<br />IObserver<T><br />IObservable<T><br />
    50. 50. Reactive Extension<br />Observable/Observer <T><br /><ul><li>Souscription
    51. 51. Enumerator action : OnNext</li></ul>Delegate se déroulant à chaque item.<br /><ul><li>OnError</li></ul>Delegate se déroulant lors d’une erreur<br /><ul><li>OnCompleted</li></ul>Delegate se déroulant lorsque la tache est terminée<br />
    52. 52. Reactive Extension<br />Observable/Observer <T><br /><ul><li>Souscription
    53. 53. La séquence est envoyée vers les souscriptions
    54. 54. A chaque donnée de séquence, le delegate reçoit l’item typé => C’est à vous d’y placer une logique.
    55. 55. A chaque mise à jour de la source de données, les nouvelles séquences sont également envoyées.</li></li></ul><li>Reactive Extension<br />Observable/Observer <T><br /><ul><li>Linq to Observable</li></li></ul><li>Rx Extensions : Premier pas<br />
    56. 56. Reactive Extension<br /> « Basedevents programming »<br /><ul><li>Utilisation des events comme séquence de données requêtables.
    57. 57. Ainsi, par exemple un evènementMouseMove (Forms) se transforme en une séquence de données, requétables.</li></li></ul><li>Reactive Extension<br /> « Basedevents programming »<br /><ul><li>L’ObservableCollection contient une séquence de données, « live », correspondant au retour de l’évènement lié.
    58. 58. Il devient donc facile de consommer de façon asynchrone cette séquence de données, vers plusieurs « points » / souscriptions</li></li></ul><li>Rx Extensions : Drag & drop<br />
    59. 59. Reactive Extension<br /> « Producers / Consumers »<br /><ul><li>Une source IEnumerable<T> peut devenir Observable<T>.
    60. 60. Une source Observable<T> peut être « publiée » vers des consommateurs.
    61. 61. Une source Observable<T> peut être consommée de X manières, ou X est le nombre de souscriptions.</li></li></ul><li>Reactive Extension<br /> « Producers / Consumers »<br /><ul><li>On peut imaginer un flux de données extrait d’un WebService :
    62. 62. 3 souscriptions dans l’application :
    63. 63. L’onglet News de l’application
    64. 64. L’onglet Tag
    65. 65. L’onglet Catégories
    66. 66. Chaque onglet est alors mis à jour en live.</li></li></ul><li>Reactive Extension<br />Conclusion<br /><ul><li>Reactive extensions = Reactiveprogramming
    67. 67. Facilite et simplifie l’écriture d’applications asynchrones ( WinForms, WPF, WPhone7…)
    68. 68. Réponses à de nombreuses problématiques de développement asynchrones</li></li></ul><li>Visual Studio Async CTP (SP1 Refresh)<br />http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4738205d-5682-47bf-b62e-641f6441735b&displaylang=en<br />TPL Dataflow<br />http://msdn.microsoft.com/en-us/devlabs/gg585582<br />Asynchronous Programing Model<br />http://msdn.microsoft.com/fr-fr/library/ms228969(v=VS.85)<br />Event-Based Asynchronous Pattern<br />http://msdn.microsoft.com/fr-fr/library/hkasytyf(v=VS.85).aspx<br />http://blogs.msdn.com/b/devpara/<br />Ressources<br />
    69. 69. RxExtensions<br />http://msdn.microsoft.com/en-us/data/gg577609<br />Introduction<br />http://msdn.microsoft.com/en-us/data/gg577611<br />Samples<br />http://rxwiki.wikidot.com/101samples<br />Ressources<br />

    ×