2. Objectif
Exécuter des tâches l'une après l'autres dans un service Windows. Les tâches se mettront en
file d'attente dans le cas où une tâche est déjà en cours d'exécution.
Use Case:
Un utilisateur doit pouvoir exécuter des taches au travers d'un site Asp .net
TPL
C'est une librairie qui permet de mettre en place simplement des mécanismes asynchrones.
Task Parrallel Library
Incluant les namespaces System.Threading et System.Threading.Tasks.
Je ne vais rentrer dans les détails de la TPL.
Juste la base pour le lancement de tâches:
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - contact@novencia.com 2
3. Par contre dans le cas ci-dessus les taches vont s'exécuter en même temps.
L'output donnera ceci :
C'est là qu'entre en jeu l'utilisation de tache planifiées (Scheduling task)
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - contact@novencia.com 3
4. Taches Planifiées
Par défaut, la TPL (aussi Plinq) , utilise le .NET Framework ThreadPool.
C'est là qu'entre en jeu l'utilisation de tache planifiées (Scheduling task)
Par défaut, la TPL (aussi Plinq) , utilise le .NET Framework ThreadPool.
Les taches sont exécutées par des threads worker (leurs nombres maximum dépendent de la
machine). Ils récupèrent les taches à partir du threadPool et les exécutent. Si tous les
threadWorker sont occupés alors les nouvelles tâches sont laissées dans la file d'attente globale
du threadPool.
Il existe une file d'attente globale et des files d'attentes locales propres à chaque tâche.
Mais ces planifications peuvent être largement étendues grâce à la possibilité d'extension de la
classe abstraite TaskScheduler , qui peut être dérivée pour implémenter des algorithmes de
planification personnalisés, comme ce qui est fait dans la librairie Parrallel Extensions Extra
Infos:
A propos de la file d'attente globale et locale du Thread Pool je vous conseille ces deux articles :
Task Scheduler MSDN
Work-Stealing
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - contact@novencia.com 4
5. Parallel Extensions Extras
La librairie est disponible ici.
Dans les différents projets il y a ParrallelExtensionExtras.
Elle est développée par l'équipe qui s'occupe de la parallélisassions chez Microsoft, notamment
Stephen Toub.
PEE a beaucoup de fonctionnalités différentes, sur ce billet on s'arrêtera juste sur les
TaskScheduler. Et plus précisément sur :
OrderedTaskScheduler
QueuedTaskScheduler
OrderedTaskScheduler
C'est une variante plus basique du QueuedTaskScheduler.
Elle n'a qu'une fonction : mettre en file d'attente les différentes tâches assignées.
Pas de multi threading.
Elle m'a servit à mettre en place en quelques ligne de code un système de mise en file d'attente
efficace.
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - contact@novencia.com 5
6. Voyons un peu le code:
Et donc grâce à notre TaskScheduler , contrairement au premier exemple, Les tâches sont mises
en attente et exécuter l'une après l'autre.
L'output donnera ceci :
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - contact@novencia.com 6
7. On remarque aussi que ce TaskScheduler n'utilise q'un seul thread worker.
Donc très facilement en quelque lignes de codes on peut mettre en place un système de file d'attente
qui pourrait être particulièrement utile dans l'exécution de différente tâches utilisateur (Chargement
de données, Différents traitements sur les données…)
Mais voilà ça ne me suffit pas je veux pouvoir prioriser des tâches.
QueuedTaskScheduler
Pour pouvoir prioriser les taches nous allons utiliser la classe QueuedTaskScheduler.
Priorisation :
Code :
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - contact@novencia.com 7
8. Toutes les tâches assignées au scheduler pri0 seront priorisées.
L'output donne cela :
On voit bien la priorité donné aux tâches High.
On remarque aussi dans le constructeur le paramètre threadCount.
En Effet ce TaskScheduler est multiThread et on peut lui préciser sur combien de niveau.
Pour l'exemple je l'ai rendu MonoThread avec qu'une seule exécution possible.
Si aucun paramètre n'est passé il prendra par défaut les capacités de la machine.
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - contact@novencia.com 8
9. Conclusion
Comme on a pu le voir, Il existe des librairies puissantes qui nous permettent de mettre en place
des systèmes complexes très facilement.
On peut très bien imaginer utiliser ces fonctionnalités dans un service Windows qui exécuterait
des tâches envoyées par des clients externes.
Il y a encore beaucoup de fonctionnalités disponibles, notamment avec le QueuedTaskScheduler.
A vous de les découvrir.
31/01/2012 Groupe NOVENCIA - 25 Rue de Maubeuge 75009 PARIS - Tél. : 01 44 63 53 13 - Fax : 01 44 63 53 14 - www.novencia.com - contact@novencia.com 9