Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. |
Traduction
Source
|
ThreadPool, classe
Fournit un pool de threads qui peuvent servir à exécuter des tâches, publier des éléments de travail, traiter des E/S asynchrones, attendre au nom d'autres threads et traiter des minuteries.
Assembly : mscorlib (dans mscorlib.dll)
Le type ThreadPool expose les membres suivants.
| Nom | Description | |
|---|---|---|
|
BindHandle(IntPtr) | Obsolète. Cette méthode lie un handle de système d'exploitation à ThreadPool. |
|
BindHandle(SafeHandle) | Cette méthode lie un handle de système d'exploitation à ThreadPool. |
|
GetAvailableThreads | Récupère la différence entre le nombre maximal de threads du pool, retourné par la méthode GetMaxThreads et le nombre actuel de threads actifs. |
|
GetMaxThreads | Récupère le nombre de demandes à l'adresse du pool de threads pouvant être simultanément actives. Toutes les demandes excédant ce nombre restent dans la file d'attente jusqu'à ce que des threads du pool soient disponibles. |
|
GetMinThreads | Extrait le nombre minimum de threads que le pool de threads crée à la requête, au fur et à mesure que les nouvelles requêtes sont effectuées, avant de basculer sur un algorithme pour la gestion de la création et la suppression des threads. |
|
QueueUserWorkItem(WaitCallback) | Place une méthode en file d'attente pour exécution. La méthode s'exécute lorsqu'un thread du pool devient disponible. |
|
QueueUserWorkItem(WaitCallback, Object) | Place une méthode en file d'attente pour exécution et spécifie un objet contenant les données que la méthode doit utiliser. La méthode s'exécute lorsqu'un thread du pool devient disponible. |
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) | Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier signé 32 bits. |
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) | Inscrit un délégué en attente d'un WaitHandle, en spécifiant un entier signé 64 bits pour indiquer le délai en millisecondes. |
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) | Inscrit un délégué en attente de WaitHandle, en spécifiant une valeur TimeSpan pour indiquer le délai. |
|
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) | Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier non signé 32 bits. |
|
SetMaxThreads | Définit le nombre de demandes à l'adresse du pool de threads pouvant être simultanément actives. Toutes les demandes excédant ce nombre restent dans la file d'attente jusqu'à ce que des threads du pool soient disponibles. |
|
SetMinThreads | Définit le nombre minimum de threads que le pool de threads crée à la requête, au fur et à mesure que les nouvelles requêtes sont effectuées, avant de basculer sur un algorithme pour la gestion de la création et la suppression des threads. |
|
UnsafeQueueNativeOverlapped | Met en file d'attente l'exécution d'une opération d'E/S avec chevauchement. |
|
UnsafeQueueUserWorkItem | Met le délégué spécifié en file d'attente dans le pool de threads, mais ne propage pas la pile d'appels vers le thread de travail. |
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) | Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier signé 32 bits. Cette méthode ne propage pas la pile appelante vers le thread de travail. |
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) | Inscrit un délégué en attente d'un WaitHandle, en spécifiant un entier signé 64 bits pour indiquer le délai en millisecondes. Cette méthode ne propage pas la pile appelante vers le thread de travail. |
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) | Inscrit un délégué en attente de WaitHandle, en spécifiant une valeur TimeSpan pour indiquer le délai. Cette méthode ne propage pas la pile appelante vers le thread de travail. |
|
UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) | Inscrit un délégué pour attendre un WaitHandle, en utilisant, pour indiquer le délai en millisecondes, un entier non signé 32 bits. Cette méthode ne propage pas la pile appelante vers le thread de travail. |
De nombreuses applications créent des threads passant beaucoup de temps en état de veille, dans lequel ils attendent qu'un événement se produise. D'autres threads peuvent entrer en état de veille pour n'être réactivés que de temps en temps, lors d'une demande de modification ou d'une demande de mise à jour des informations sur l'état. Les threads regroupés en pools sont plus efficaces car votre application dispose ainsi d'un pool de threads de travail qui sont managés par le système. Exemples d'opérations qui utilisent des threads de pool de threads :
-
Lorsque vous créez un objet Task ou Task<TResult> pour effectuer une tâche en mode asynchrone, par défaut la tâche est planifiée pour être exécutée sur un thread ThreadPool.
-
Les minuteries asynchrones utilisent le pool de threads. Les threads ThreadPool exécutent des rappels de la classe System.Threading.Timer et déclenchent des événements de la classe System.Timers.Timer.
-
Lorsque vous utilisez des handles d'attente enregistrés, un thread système surveille l'état des handles d'attente. Lorsqu'une attente se termine, un thread de travail du pool exécute la fonction de rappel correspondante.
Remarque
|
|---|
|
Les threads du pool de threads managés sont des threads d'arrière-plan, c'est-à-dire que leurs propriétés IsBackground ont la valeur true. Cela signifie qu'un thread ThreadPool ne maintient pas une application en cours d'exécution une fois que tous les threads de premier plan sont arrêtés. |
Il est également possible de mettre en file d'attente dans le pool de threads des éléments de travail non liés à une attente. Pour demander qu'un élément de travail soit géré par un thread du pool, appelez la méthode QueueUserWorkItem. 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é dans le pool. Il n'existe aucun moyen d'annuler un élément de travail une fois qu'il a été placé en file d'attente.
Des minuteries de files d'attente et des opérations d'attente inscrites utilisent également le pool de threads. Leurs fonctions de rappel sont placées en file d'attente dans le pool de threads.
Il existe un pool de threads par processus. À compter de .NET Framework version 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 méthode GetMaxThreads pour déterminer le nombre de threads. Vous pouvez modifier le nombre de threads dans le pool à l'aide de la méthode SetMaxThreads. Chaque thread utilise la taille de pile et l'ordre de priorité d'exécution par défaut.
Remarque
|
|---|
|
Le code non managé qui héberge le .NET Framework 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 de terminaison d'E/S à la demande jusqu'à ce qu'il atteigne le minimum pour chaque catégorie. Lorsqu'une valeur minimale est atteinte, le pool de threads peut créer des threads supplémentaires dans cette catégorie ou attendre que certaines tâches s'achèvent. À compter de .NET Framework 4, le pool de threads crée et détruit des threads de travail afin d'optimiser le débit, qui est défini comme étant le nombre de tâches exécutées par unité de temps. Un nombre insuffisant de threads risque d'empêcher une utilisation optimale des ressources disponibles, tandis qu'un trop grand nombre de threads peut augmenter le conflit de ressources.
Remarque
|
|---|
|
Lorsqu'une demande est faible, le nombre réel de threads de pool de threads peut tomber en dessous des valeurs minimales. |
Vous pouvez utiliser la méthode GetMinThreads pour obtenir ces valeurs minimales.
Attention
|
|---|
|
Vous pouvez utiliser la méthode SetMinThreads pour augmenter le nombre minimal de threads. Toutefois, augmenter inutilement ces valeurs peut provoquer des problèmes de performances. Si trop de tâches démarrent en même temps, elles risquent toutes de s'exécuter avec lenteur. Dans la plupart des cas, le pool de threads sera plus performant avec son propre algorithme pour allouer des threads. |
Lorsque le pool de threads réutilise un thread, il n'efface pas les données dans le stockage local des threads ni dans les champs marqués avec l'attribut ThreadStaticAttribute. Par conséquent, les données placées dans le stockage local des threads par une méthode peuvent être exposées à toute autre méthode exécutée par le même thread ThreadPool. Une méthode qui accède à un champ marqué avec l'attribut ThreadStaticAttribute peut rencontrer des données différentes selon le thread ThreadPool qui l'exécute.
Remarque
|
|---|
|
L'attribut HostProtectionAttribute appliqué à ce type ou membre a la valeur de propriété Resources suivante : Synchronization | ExternalThreading. HostProtectionAttribute n'affecte pas les applications bureautiques (qui sont généralement démarrées en double-cliquant sur une icône, en tapant une commande ou en entrant une URL dans un navigateur). Pour plus d'informations, consultez la classe HostProtectionAttribute ou Attributs de programmation et de protection des hôtes SQL Server. |
using System; using System.Threading; public class Example { public static void Main() { // Queue the task. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); Console.WriteLine("Main thread does some work, then sleeps."); // If you comment out the Sleep, the main thread exits before // the thread pool task runs. The thread pool uses background // threads, which do not keep the application running. (This // is a simple example of a race condition.) 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."); } }
Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2
Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Remarque
Attention