J'ai entendu récemment un grand nombre de podcasts sur la TPL dans .NET 4.0. La plupart d'entre eux décrivent des activités en arrière-plan, comme le téléchargement d'images ou un calcul, en utilisant des tâches pour que le travail n'interfère pas avec un thread de l'interface graphique.
La plupart du code sur lequel je travaille a plutôt une saveur de producteur multiple / consommateur unique, où les éléments de travail provenant de plusieurs sources doivent être mis en file d'attente et ensuite traités dans l'ordre. Un exemple serait la journalisation, où les lignes de journal de plusieurs threads sont séquentialisées dans une seule file d'attente pour une éventuelle écriture dans un fichier ou une base de données. Tous les enregistrements d'une même source doivent rester dans l'ordre, et les enregistrements d'un même moment doivent être "proches" les uns des autres dans le résultat final.
Ainsi, plusieurs threads ou tâches ou autres invoquent tous une file d'attente :
lock( _queue ) // or use a lock-free queue!
{
_queue.enqueue( some_work );
_queueSemaphore.Release();
}
Et un fil de travail dédié traite la file d'attente :
while( _queueSemaphore.WaitOne() )
{
lock( _queue )
{
some_work = _queue.dequeue();
}
deal_with( some_work );
}
Il a toujours semblé raisonnable de dédier un thread de travail pour le côté consommateur de ces tâches. Devrais-je écrire mes futurs programmes en utilisant plutôt une construction de la TPL ? Laquelle ? Pourquoi ?