Partager via


Pool de threads managés

La System.Threading.ThreadPool classe fournit à votre application un pool de threads de travail gérés par le système, ce qui vous permet de vous concentrer sur les tâches d’application plutôt que sur la gestion des threads. Si vous avez des tâches courtes qui nécessitent un traitement en arrière-plan, le pool de threads managés est un moyen simple de tirer parti de plusieurs threads. L’utilisation du pool de threads est considérablement plus facile dans Framework 4 et versions ultérieures, car vous pouvez créer et Task<TResult> objets Task qui effectuent des tâches asynchrones sur des threads de pool de threads.

.NET utilise des threads de pool de threads à de nombreuses fins, notamment les opérations TPL (Task Parallel Library), l’achèvement asynchrone des E/S, les rappels du minuteur , les opérations d’attente inscrites, les appels de méthode asynchrone à l’aide de délégués et System.Net de connexions de socket.

Caractéristiques du pool de threads

Les threads de pool de threads sont des threads d’arrière-plan . Chaque thread utilise la taille de pile par défaut, s’exécute à la priorité par défaut et se trouve dans l’appartement multithread. Une fois qu’un thread du pool de threads a terminé sa tâche, il est retourné à une file d’attente de threads en attente. À partir de ce moment, il peut être réutilisé. Cette réutilisation permet aux applications d’éviter le coût de la création d’un thread pour chaque tâche.

Il n’existe qu’un seul pool de threads par processus.

Exceptions dans les threads de pool de threads

Les exceptions non gérées dans les threads de pool de threads terminent le processus. Il y a trois exceptions à cette règle :

Pour plus d’informations, consultez Exceptions dans les threads managés.

Nombre maximal de threads de pool de threads

Le nombre d’opérations pouvant être mises en file d’attente vers le pool de threads est limité uniquement par la mémoire disponible. Toutefois, le pool de threads limite le nombre de threads qui peuvent être actifs simultanément dans le processus. Si tous les threads de pool de threads sont occupés, des éléments de travail supplémentaires sont mis en file d’attente jusqu’à ce que les threads soient exécutés. La taille par défaut du pool de threads pour un processus dépend de plusieurs facteurs, tels que la taille de l’espace d’adressage virtuel. Un processus peut appeler la ThreadPool.GetMaxThreads méthode pour déterminer le nombre de threads.

Vous pouvez contrôler le nombre maximal de threads à l’aide des méthodes et ThreadPool.SetMaxThreads des ThreadPool.GetMaxThreads méthodes.

Remarque

Le code qui héberge le Common Language Runtime peut définir la taille à l’aide de la ICorThreadpool::CorSetMaxThreads méthode.

Nombre minimal de pools de threads

Le pool de threads fournit de nouveaux threads de travail ou threads d’achèvement d’E/S à la demande jusqu’à ce qu’il atteigne un minimum spécifié pour chaque catégorie. Vous pouvez utiliser la ThreadPool.GetMinThreads méthode pour obtenir ces valeurs minimales.

Remarque

Lorsque la demande est faible, le nombre réel de threads de pool de threads peut être inférieur aux valeurs minimales.

Lorsqu’un minimum est atteint, le pool de threads peut créer des threads supplémentaires ou attendre que certaines tâches se terminent. Le pool de threads crée et détruit les threads de travail afin d’optimiser le débit, qui est défini comme le nombre de tâches qui se terminent par unité de temps. Trop peu de threads peuvent ne pas utiliser de manière optimale les ressources disponibles, tandis que trop de threads peuvent augmenter la contention des ressources.

Avertissement

Vous pouvez utiliser la ThreadPool.SetMinThreads méthode pour augmenter le nombre minimal de threads inactifs. Toutefois, l’augmentation inutile de ces valeurs peut entraîner des problèmes de performances. Si un trop grand nombre de tâches commencent en même temps, toutes ces tâches peuvent sembler lentes. Dans la plupart des cas, le pool de threads s’effectue mieux avec son propre algorithme pour allouer des threads.

Utilisation du pool de threads

Le moyen le plus simple d’utiliser le pool de threads consiste à utiliser la bibliothèque parallèle de tâches (TPL) . Par défaut, les types TPL comme Task et Task<TResult> utilisent des threads de pool de threads pour exécuter des tâches.

Vous pouvez également utiliser le pool de threads en appelant ThreadPool.QueueUserWorkItem à partir du code managé (ou ICorThreadpool::CorQueueUserWorkItem du code non managé) et en transmettant un System.Threading.WaitCallback délégué représentant la méthode qui effectue la tâche.

Une autre façon d’utiliser le pool de threads consiste à mettre en file d’attente des éléments de travail liés à une opération d’attente à l’aide de la ThreadPool.RegisterWaitForSingleObject méthode et à passer un System.Threading.WaitHandle message qui, lorsqu’il est signalé ou quand il a expiré, appelle la méthode représentée par le System.Threading.WaitOrTimerCallback délégué. Les threads de pool de threads sont utilisés pour appeler des méthodes de rappel.

Pour obtenir les exemples, consultez les pages d’API référencées.

Ignorer les vérifications de sécurité

Le pool de threads fournit également les méthodes et ThreadPool.UnsafeRegisterWaitForSingleObject les ThreadPool.UnsafeQueueUserWorkItem méthodes. Utilisez ces méthodes uniquement lorsque vous êtes certain que la pile de l’appelant n’est pas pertinente pour toutes les vérifications de sécurité effectuées pendant l’exécution de la tâche mise en file d’attente. ThreadPool.QueueUserWorkItem et ThreadPool.RegisterWaitForSingleObject capturent la pile de l’appelant, qui est fusionnée dans la pile du thread de pool de threads lorsque le thread commence à exécuter une tâche. Si une vérification de sécurité est requise, la pile entière doit être vérifiée. Bien que la vérification assure la sécurité, elle a également un coût de performance.

Quand n’utiliser pas de threads de pool de threads

Il existe plusieurs scénarios dans lesquels il est approprié de créer et de gérer vos propres threads au lieu d’utiliser des threads de pool de threads :

  • Vous avez besoin d’un thread de premier plan.
  • Vous avez besoin d’un thread pour avoir une priorité particulière.
  • Vous avez des tâches qui provoquent le blocage du thread pendant de longues périodes. Le pool de threads a un nombre maximal de threads. Par conséquent, un grand nombre de threads de pool de threads bloqués peuvent empêcher le démarrage des tâches.
  • Vous devez placer des threads dans un appartement à thread unique. Tous les ThreadPool threads se trouvent dans l’appartement multithread.
  • Vous devez disposer d’une identité stable associée au thread ou de dédier un thread à une tâche.

Voir aussi