Implémentation d’un Timer avec TPL

Dans cet article, on cherche à proposer une implémentation d’un Timer en utilisant TPL (i.e. Task Parallel Library). Il existe une classe qui permet d’effectuer un traitement de façon périodique: System.Threading.Timer. Cette classe n’est pas très moderne puisqu’elle existe depuis les premières versions du Framework. Elle permet d’effectuer correctement un traitement périodique toutefois elle souffre…

Continuer à lire

Interesting reads – Async/Await

Some interesting articles regarding async/await in .NET: General explanations Getting Started with Async / Await: https://blog.xamarin.com/getting-started-with-async-await/ Async and Await: http://blog.stephencleary.com/2012/02/async-and-await.html Eliding Async and Await: http://blog.stephencleary.com/2016/12/eliding-async-await.html Async/Await – Best Practices in Asynchronous Programming: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx Performance matters Understanding & Profiling C# Async Await Tasks: https://stackify.com/csharp-async-await-task-performance/ Dissecting the async methods in C#: https://blogs.msdn.microsoft.com/seteplia/2017/11/30/dissecting-the-async-methods-in-c/ Extending the async methods in…

Continuer à lire

PLINQ en 5 min

L’intérêt de Parallel LINQ (PLINQ) est de proposer plusieurs méthodes pour regrouper (“merger”) le résultat d’un traitement parallèle. Simplement en lançant un traitement parallèle en utilisant AsParallel(), on bénéficiera de méthodes pour, par exemple: Ranger le résultat de chaque traitement dans une structure de données, Agréger les résultats sous forme d’un entier ou d’un double…

Continuer à lire

Exécution asynchrone avec "await" et "async" en 5 min

“Await” et “async” ne sont pas des mot-clé qui permettent la création de thread mais ils permettent d’indiquer au compilateur: les méthodes pour lesquelles l’exécution sera asynchrone en utilisant “async”, les endroits dans le code où on va attendre la fin de l’exécution d’une tâche en utilisant “await”. L’asynchronisme avec Async/Await permet, par exemple, d’éviter…

Continuer à lire

Parallel.For et Parallel.ForEach en 5 min

Parallel.For() et Parallel.ForEach() permettent de paralléliser l’exécution d’une boucle. La syntaxe de ces instructions est très proche de celles des boucles for et foreach, toutefois leur utilisation est loin d’être anodine. Il faut observer certaines précautions et avoir toujours en tête que l’exécution du corps des boucles se fait en parallèle et non séquentiellement. Parallélisation…

Continuer à lire

Quelques patterns pour attendre la fin de l’exécution d’une tâche*

*: Le terme “Tâche” est utilisé içi au sens large et non au sens de la Task Parallel Library (TPL). Lorsque plusieurs threads sont utilisés et qu’il est nécessaire de synchroniser certains de ces threads, on peut être amener à implémenter des mécanismes d’attente. Ces mécanismes permettent ainsi: D’éviter un accès concurrent à une section…

Continuer à lire

"ConcurrentDictionary" en 5 min

A partir du framework 4.0, la structure de données "ConcurrentDictionary" permet de stocker des objets rangés par clé tout en autorisant des accès provenant de "threads" multiples sans se préoccuper des problématiques de synchronisation. Son utilisation est très similaire à celle du dictionaire mise à part qu’elle possède des méthodes pour guider l’implémentation et s’affranchir…

Continuer à lire

Utilisation des "Task" en 5 min

Sommaire 1. Quelques patterns courants  Lancer l’exécution d’une tâche  Attendre la fin de l’exécution de la tâche  Récupérer le résultat d’une tâche  Notion de tâche parente  Utilisation de l’option de création “LongRunning”  FromException(), FromCanceled() et FromResult() 2. Gestion des exceptions  AggregateException  CancellationToken 3. TaskScheduler  Task et thread principal  Problème lecteur/écrivain 4. Exécution asynchrone 5. TaskCompletionSource…

Continuer à lire