Quelle serait la meilleure approche pour la mise en œuvre des tâches avec une clé qui fonctionne comme suit: -mise en œuvre « seulement l'un des » et « non en parallèle » sémantique avec la bibliothèque parallèle de tâches
Option 1) Une seule de cette La clé est toujours en attente. Peut être utilisé, par exemple, à partir de ASP.NET MVC pour mettre en file d'attente un seul rendu pour une image miniature quel que soit le nombre de fois que l'image est cliquée. Un seul s'exécute, toutes les autres demandes attendent que celui-ci soit terminé.
Option 2) Tous les articles avec la même clé doivent s'exécuter séquentiellement. Peut être utilisé par exemple pour garantir que les opérations qui récupèrent un fichier d'un magasin de sauvegarde dans un cache local n'essaient pas toutes d'obtenir le fichier dans le cache en même temps. L'option 1 est un cas particulier dans lequel les actions suivantes avec la même clé sont simplement rejetées (en général, il suffit d'enregistrer une vérification de fichier existant).
J'ai une WorkQueue existante qui gère ces deux cas (ainsi que l'état de l'appartement, les paramètres ThreadPriority et les degrés maximum de parallélisme). TPL semble être la meilleure solution pour remplacer ceci et apportera des options d'annulation améliorées.
Les tâches imbriquées avec suites semblent prometteuses, mais la gestion d'un dictionnaire de tâches en file d'attente est vite compliquée entre les classes TaskFactory et TaskScheduler. Hériter de la tâche est également problématique car ni TaskFactory ni TaskScheduler ne sont génériques dans Task.
La plupart des exemples de tâches parallèles supposent que l'ensemble des tâches est connu à l'avance. Dans ce cas, de nouvelles tâches sont ajoutées en permanence et doivent être rejetées ou enchaînées sur des tâches existantes en fonction de l'opération demandée et de la clé transmise.
Est-ce que quelqu'un a implémenté quelque chose de similaire à cela en utilisant TPL? approche avez-vous pris dans vos classes Task, TaskScheduler et TaskFactory?
Mauvaise lecture de votre question, oops –