Dormir dans un thread en pool C #

Dans ce tutoriel Web sur le threading en C #, Joseph Albahari écrit: “Ne dormez pas dans des threads groupés!” Pourquoi ne devriez-vous pas faire cela? Dans quelle mesure cela peut-il affecter les performances? (Ce n’est pas que je veuille le faire; je suis simplement curieux.)

Le fil est un object lourd.
La création d’un nouveau thread nécessite de nombreuses ressources, telles que l’affectation de 1 Mo pour une stack gérée, la création d’un object de thread géré, de la stack du kernel, de l’object de thread du kernel et du bloc d’environnement de thread d’utilisateur. Tout cela prend du temps et de la mémoire. Par conséquent, vous ne voulez pas créer et détruire des objects très rapidement. En outre, une fois que vous avez plusieurs threads, le changement de contexte nécessite également certaines ressources.

Le pool de threads est un emplacement où CLR peut mettre des threads inutilisés, au cas où votre application en aurait besoin.
Le pool de threads contient initialement 0 threads. Dès que vous demandez un thread à un pool, le pool crée rapidement le nombre minimum de threads définis pour le pool. Après environ 2 minutes, les threads non utilisés sont tués. Mais si la charge augmente et que vous avez besoin de plus de threads, le pool de threads créera lentement de nouveaux threads jusqu’à atteindre la limite maximale. Vous ne pouvez pas avoir plus de threads que le maximum, toutes les nouvelles demandes seront mises en queue et exécutées une fois qu’un thread de travail est retourné dans le pool. Dans le pire des cas, vous pouvez obtenir OutOfMemoryException

Si un thread extrait d’un pool est bloqué, il:

  • Détient les ressources
  • Ne fait pas de travail précieux, alors qu’une application peut avoir besoin de ce fil pour une nouvelle demande
  • Brise l’évolutivité en introduisant des blocs

Il n’y a qu’un nombre limité de threads dans le pool de threads; Les pools de threads sont conçus pour exécuter efficacement un grand nombre de tâches courtes . Ils comptent sur chaque tâche pour terminer rapidement, de sorte que le thread puisse retourner dans le pool et être utilisé pour la tâche suivante.

Ainsi, dormir dans un thread de pool de threads prive le pool de ressources, ce qui peut éventuellement épuiser les threads disponibles et ne pas être en mesure de traiter les tâches que vous lui avez affectées.

Le pool de threads est conçu pour effectuer rapidement une tâche relativement courte sur un autre thread sans avoir à payer le coût de la création d’un nouveau thread. Le pool de threads a un nombre maximal de threads et, une fois atteint, les tâches sont mises en queue jusqu’à ce qu’un thread devienne disponible.

Un thread dormant sur le pool de threads bloquerait donc la queue ou consortingbuerait à l’épuisement du pool de threads.