À l'aide de TPL comment puis-je configurer un max la taille du pool de threads
Je suis en utilisant le TPL pour ajouter de nouvelles tâches pour le système de pool de threads à l'aide de la fonction Task.Factory.StartNew()
. Le seul problème est que je suis en ajoutant beaucoup de fils et je pense que c'est la création de trop pour mon processeur pour gérer. Est-il possible de définir un nombre maximum de threads dans ce pool de threads?
Ne pensons pas seulement, savoir si c'est réellement vrai.
Tous les exemples de code?
Tous les exemples de code?
OriginalL'auteur jgerstle | 2012-06-17
Vous devez vous connecter pour publier un commentaire.
La valeur par défaut
TaskScheduler
(obtenu à partir deTaskScheduler.Default
) est de type (classe interne)ThreadPoolTaskScheduler
. Cette application utilise leThreadPool
classe à la file d'attente des tâches (si leTask
n'est pas créé avecTaskCreationOptions.LongRunning
- dans ce cas, un nouveau thread est créé pour chaque tâche).Donc, si vous souhaitez limiter le nombre de threads disponibles pour
Task
les objets créés parnew Task(() => Console.WriteLine("In task"))
, vous pouvez limiter les threads disponibles dans le global pool de threads comme ceci:L'appel à
ThreadPool.GetMaxThreads()
est fait pour éviter de réduire lecompletionPortThreads
.Noter que cela peut être une mauvaise idée - depuis toutes les Tâches, sans préciser le planificateur, et nombre d'autres classes utilisent la valeur par défaut de pool de threads, la définition de la taille trop faible peut provoquer des effets secondaires: la Famine, etc.
OriginalL'auteur crimbo
Généralement TPL détermine une bonne "par défaut" la taille du pool de threads. Si vous avez vraiment besoin de moins de threads, voir Comment: Créer un Planificateur de Tâches Qui Limite le Degré de Simultanéité
OriginalL'auteur Chris Shain
Vous devez étudier vos problèmes de performance en premier. Il y a diverses questions qui peuvent entraîner une réduction de l'utilisation:
En tout cas, vous avez un problème d'évolutivité qui ne peuvent pas être traitées simplement par la réduction du nombre de tâches simultanées. Votre programme peut s'exécuter dans un de deux,quatre ou huit-core de la machine dans le futur. Limiter le nombre de tâches planifiées sera simplement conduire à un gaspillage de ressources CPU.
OriginalL'auteur Panagiotis Kanavos
Généralement le TPL planificateur doit faire un bon travail de choisir le nombre de tâches à exécuter simultanément, mais si vous voulez vraiment avoir le contrôle Mon blog montre comment faire les deux avec les Tâches et les Actions, et fournit un exemple de projet que vous pouvez télécharger et de l'exécuter pour voir à la fois dans l'action.
Un exemple de lorsque vous souhaitez explicitement à limiter le nombre de tâches sont lancées simultanément, c'est quand vous appelez de vos propres services et qui ne veulent pas surcharger votre serveur.
Pour ce que vous décrivez, il semble que vous pouvez bénéficier de plus de vous assurer que vous êtes en utilisant async/await avec vos tâches afin de prévenir inutile fil de la consommation. Cela dépendra bien sur si vous faites le CPU de travail, ou IO-travail liées dans vos tâches. Si c'est IO-lié, alors vous pouvez bénéficier grandement de l'aide async/await.
En soit, vous demande comment vous pouvez limiter le nombre de tâches qui s'exécutent simultanément, alors voici un peu de code pour montrer comment le faire avec à la fois des Actions et des Tâches.
Avec Des Actions
Si à l'aide d'Actions, vous pouvez utiliser le microphone .Net Parallèle.Appeler la fonction. Ici nous limiter à l'exécution d'au plus 3 threads en parallèle.
Avec Des Tâches
Puisque vous êtes à l'aide de Tâches ici cependant, il n'existe pas de fonction intégrée. Toutefois, vous pouvez utiliser celui que j'sur mon blog.
Et puis la création de votre liste de Tâches et l'appel de la fonction à les exécuter, à dire un maximum de 3 simultanée à un moment, vous pourriez faire ceci:
OriginalL'auteur deadlydog