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(); }
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
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());}
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; }