Disposer d'un ensemble de Tâches avec seulement X à un moment
Disons que j'ai de 100 missions que faire quelque chose qui dure 10 secondes.
Maintenant, je veux seulement courir 10 à un moment comme quand 1 de ces 10 finitions une autre tâche est exécutée jusqu'à ce que tous sont finis.
Maintenant j'ai toujours utilisé ThreadPool.QueueUserWorkItem()
pour une telle tâche, mais j'ai lu que c'est une mauvaise pratique de le faire et que je devrais utiliser plutôt des Tâches.
Mon problème est que j'ai nulle part trouvé un bon exemple pour mon scénario donc, pourriez-vous me faire sur la façon d'atteindre cet objectif avec des Tâches?
- Où avez-vous lu que l'utilisation de la
ThreadPool
était une mauvaise pratique? - Je suggère la lecture de quelques articles, et Stackoverflow offres d'il ya beaucoup de codé exemples que d'autres ont essayé et où les réponses sont fournies stackoverflow.com/questions/6192898/... faire une recherche google comme j'ai le C# Stackoverflow pool de threads.QueueUserWorkItem()
- Voulez-vous une méthode qui bloque jusqu'à ce que toutes les tâches sont effectuées, ou voulez-vous une méthode qui retourne un
Task
lorsque toutes les tâches sont effectuées? - Il doit bloquer, tout comme pool de threads n'mais avec des tâches. Certains gars ici sur Stackoverflow me dit sur un exemple de code qui Threadpool serait une mauvaise pratique
Vous devez vous connecter pour publier un commentaire.
TaskCreationOptions.LongRunning
?10
tâches dans le pire des cas, et au moins1
tâche dans le meilleur des cas.TPL Dataflow est idéal pour faire des choses comme cela. Vous pouvez créer un 100% asynchrone version de
Parallel.Invoke
assez facilement:TransformBlock
pour ce que vous voulez.Vous disposez de plusieurs options. Vous pouvez utiliser
Parallel.Invoke
pour commencer:Voici une autre option qui va travailler beaucoup plus difficile d'avoir exactement 10 tâches en cours d'exécution (bien que le nombre de threads dans le pool de threads de traitement de ces tâches peut être différente) et qui renvoie un
Task
indiquant quand il se termine, plutôt que de bloquer jusqu'à ce que fait.Si vous n'avez pas MoreLinq, pour la
Batch
fonction, voici mon plus simple de mise en œuvre:Now I want to only run 10 at a time
, MaxDegreeOfParallelism n'est qu'une limite supérieure.J'aimerais utiliser la solution la plus simple je pense, qui est, comme je pense à l'aide de la TPL:
Vous pouvez créer une méthode comme ceci:
Et puis vous pouvez appeler n'importe quel méthode async n fois, avec une limite comme ceci:
Ou si vous souhaitez exécuter long de l'exécution non de méthodes asynchrones, vous pouvez le faire de cette façon:
Peut-être il ya une méthode similaire quelque part dans le cadre, mais je n'ai pas trouver encore.