ThreadPool Classe

Définition

Fournit un pool de threads qui peuvent être utilisés pour exécuter des tâches, publier des éléments de travail, traiter des E/S asynchrones, attendre au nom d’autres threads et minuteurs de processus.

public ref class ThreadPool sealed
public ref class ThreadPool abstract sealed
public sealed class ThreadPool
public static class ThreadPool
type ThreadPool = class
Public NotInheritable Class ThreadPool
Public Class ThreadPool
Héritage
ThreadPool

Exemples

Dans l’exemple suivant, le thread d’application principal met en file d’attente une méthode nommée ThreadProc pour s’exécuter sur un thread de pool de threads, se met en veille pendant une seconde, puis se ferme. La ThreadProc méthode affiche simplement un message.

using System;
using System.Threading;

public class Example 
{
    public static void Main() 
    {
        // Queue the task.
        ThreadPool.QueueUserWorkItem(ThreadProc);
        Console.WriteLine("Main thread does some work, then sleeps.");
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }

    // This thread procedure performs the task.
    static void ThreadProc(Object stateInfo) 
    {
        // No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.");
    }
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Queue the work for execution.
        ThreadPool.QueueUserWorkItem(AddressOf ThreadProc)
        
        Console.WriteLine("Main thread does some work, then sleeps.")

        Thread.Sleep(1000)

        Console.WriteLine("Main thread exits.")
    End Sub

    ' This thread procedure performs the task.
    Sub ThreadProc(stateInfo As Object)
        ' No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.")
    End Sub
End Module
' The example displays output like the following:
'       Main thread does some work, then sleeps.
'       Hello from the thread pool.
'       Main thread exits.

Si vous commentez l’appel à la Thread.Sleep méthode, le thread principal se ferme avant l’exécution de la méthode sur le thread du pool de threads. Le pool de threads utilise des threads d’arrière-plan, qui ne conservent pas l’exécution de l’application si tous les threads de premier plan se sont arrêtés. (Il s’agit d’un exemple simple d’une condition de race.)

Remarques

De nombreuses applications créent des threads qui passent beaucoup de temps dans l’état de veille, en attendant qu’un événement se produise. D’autres threads peuvent entrer un état de veille uniquement pour être réveillés régulièrement pour interroger une modification ou mettre à jour les informations d’état. Le pool de threads vous permet d’utiliser des threads plus efficacement en fournissant à votre application un pool de threads de travail gérés par le système. Voici quelques exemples d’opérations qui utilisent des threads de pool de threads :

  • Lorsque vous créez un ou Task<TResult> un objet pour effectuer une Task tâche de manière asynchrone, par défaut, la tâche est planifiée pour s’exécuter sur un thread de pool de threads.

  • Les minuteurs asynchrones utilisent le pool de threads. Les threads de pool de threads exécutent des rappels à partir de la System.Threading.Timer classe et déclenchent des événements de la System.Timers.Timer classe.

  • Lorsque vous utilisez des handles d’attente inscrits, un thread système surveille l’état des handles d’attente. Lorsqu’une opération d’attente se termine, un thread de travail du pool de threads exécute la fonction de rappel correspondante.

  • Lorsque vous appelez la QueueUserWorkItem méthode pour mettre en file d’attente une méthode pour l’exécution sur un thread de pool de threads. Pour ce faire, transmettez la méthode à un WaitCallback délégué. Le délégué a la signature

    void WaitCallback(Object state)
    
    Sub WaitCallback(state As Object)
    

    state est un objet qui contient des données à utiliser par le délégué. Les données réelles peuvent être transmises au délégué en appelant la QueueUserWorkItem(WaitCallback, Object) méthode.

Note

Les threads du pool de threads managés sont des threads d’arrière-plan. Autrement dit, leurs IsBackground propriétés sont true. Cela signifie qu’un ThreadPool thread ne conserve pas une application en cours d’exécution une fois que tous les threads de premier plan ont quitté.

Important

Lorsque le pool de threads réutilise un thread, il n’efface pas les données dans le stockage local du thread ou dans les champs marqués avec l’attribut ThreadStaticAttribute . Par conséquent, lorsqu’une méthode examine le stockage local de threads ou les champs marqués avec l’attribut ThreadStaticAttribute , les valeurs qu’elle trouve peuvent être laissées à partir d’une utilisation antérieure du thread de pool de threads.

Vous pouvez également mettre en file d’attente les éléments de travail qui ne sont pas liés à une opération d’attente au pool de threads. Pour demander qu’un élément de travail soit géré par un thread dans le pool de threads, appelez la QueueUserWorkItem méthode. Cette méthode prend comme paramètre une référence à la méthode ou au délégué qui sera appelé par le thread sélectionné à partir du pool de threads. Il n’existe aucun moyen d’annuler un élément de travail une fois qu’il a été mis en file d’attente.

Les minuteurs de file d’attente du minuteur et les opérations d’attente inscrites utilisent également le pool de threads. Leurs fonctions de rappel sont mises en file d’attente vers le pool de threads.

Il existe un pool de threads par processus. À compter de la .NET Framework 4, 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 GetMaxThreads méthode pour déterminer le nombre de threads. Le nombre de threads dans le pool de threads peut être modifié à l’aide de la SetMaxThreads méthode. Chaque thread utilise la taille de pile par défaut et s’exécute au niveau de la priorité par défaut.

Note

Le code non managé qui héberge l’infrastructure .NET peut modifier la taille du pool de threads à l’aide de la fonction CorSetMaxThreads, définie dans le fichier mscoree.h.

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 le maximum pour chaque catégorie. Lorsqu’un maximum est atteint, le pool de threads peut créer des threads supplémentaires dans cette catégorie ou attendre que certaines tâches se terminent. À compter de l’infrastructure .NET 4, 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.

Note

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

Vous pouvez utiliser la GetMinThreads méthode pour obtenir ces valeurs minimales.

Avertissement

Vous pouvez utiliser la SetMinThreads méthode pour augmenter le nombre minimal de threads. 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 fonctionnera mieux grâce à son propre algorithme d'allocation de threads.

Méthodes

Nom Description
BindHandle(IntPtr)
Obsolète.

Lie un handle de système d’exploitation au ThreadPool.

BindHandle(SafeHandle)

Lie un handle de système d’exploitation au ThreadPool.

GetAvailableThreads(Int32, Int32)

Récupère la différence entre le nombre maximal de threads de pool de threads retournés par la GetMaxThreads(Int32, Int32) méthode et le nombre actuellement actif.

GetMaxThreads(Int32, Int32)

Récupère le nombre de requêtes adressées au pool de threads qui peuvent être actives simultanément. Toutes les requêtes au-dessus de ce nombre restent mises en file d’attente jusqu’à ce que les threads du pool de threads deviennent disponibles.

GetMinThreads(Int32, Int32)

Récupère le nombre minimal de threads créés par le pool de threads à la demande, à mesure que de nouvelles requêtes sont effectuées, avant de passer à un algorithme pour gérer la création et la destruction des threads.

QueueUserWorkItem(WaitCallback, Object)

Met en file d’attente une méthode pour l’exécution et spécifie un objet contenant des données à utiliser par la méthode. La méthode s’exécute lorsqu’un thread de pool de threads devient disponible.

QueueUserWorkItem(WaitCallback)

Met en file d’attente une méthode pour l’exécution. La méthode s’exécute lorsqu’un thread de pool de threads devient disponible.

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Met en file d’attente une méthode spécifiée par un Action<T> délégué pour l’exécution et fournit des données à utiliser par la méthode. La méthode s’exécute lorsqu’un thread de pool de threads devient disponible.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Inscrit un délégué pour attendre un WaitHandleentier signé 32 bits en millisecondes.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Inscrit un délégué pour attendre un WaitHandleentier signé 64 bits en millisecondes.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Inscrit un délégué pour attendre un WaitHandle, en spécifiant une TimeSpan valeur pour le délai d’attente.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Inscrit un délégué pour attendre un WaitHandleentier non signé 32 bits pour le délai d’attente en millisecondes.

SetMaxThreads(Int32, Int32)

Définit le nombre de requêtes adressées au pool de threads qui peuvent être actives simultanément. Toutes les requêtes au-dessus de ce nombre restent mises en file d’attente jusqu’à ce que les threads du pool de threads deviennent disponibles.

SetMinThreads(Int32, Int32)

Définit le nombre minimal de threads créés par le pool de threads à la demande, à mesure que de nouvelles demandes sont effectuées, avant de passer à un algorithme pour gérer la création et la destruction des threads.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

Met en file d’attente une opération d’E/S superposée pour l’exécution.

UnsafeQueueUserWorkItem(WaitCallback, Object)

Met en file d’attente le délégué spécifié au pool de threads, mais ne propage pas la pile appelante vers le thread de travail.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Inscrit un délégué pour attendre un WaitHandleentier signé 32 bits en millisecondes. Cette méthode ne propage pas la pile appelante au thread de travail.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Inscrit un délégué pour attendre un WaitHandleentier signé 64 bits en millisecondes. Cette méthode ne propage pas la pile appelante au thread de travail.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Inscrit un délégué pour attendre un WaitHandle, en spécifiant une TimeSpan valeur pour le délai d’attente. Cette méthode ne propage pas la pile appelante au thread de travail.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Inscrit un délégué pour attendre un WaitHandleentier non signé 32 bits pour le délai d’attente en millisecondes. Cette méthode ne propage pas la pile appelante au thread de travail.

S’applique à

Cohérence de thread

Ce type est thread safe.

Voir aussi