Partager via


Mise en pool de threads (C# et Visual Basic)

Un pool de threads est une collection de threads qui peut être utilisée pour effectuer plusieurs tâches en arrière-plan. (Pour des informations générales, consultez Threads (C# et Visual Basic).) Cela laisse le thread principal libre pour effectuer d'autres tâches de façon asynchrone.

Les pools de threads sont souvent employés dans des applications serveur. Chaque requête entrante est assignée à un thread du pool de threads, de sorte que la demande peut être traitée de façon asynchrone, sans lier le thread principal ou différer le traitement de demandes suivantes.

Une fois qu'un thread du pool complète sa tâche, il est retourné à une file d'attente de threads en attente, où il peut être réutilisé. Cette réutilisation permet aux applications d'épargner le coût de la création d'un thread pour chaque tâche.

Les pools de threads ont en général un nombre maximal de threads. Si tous les threads sont occupés, des tâches supplémentaires sont placées dans la file d'attente jusqu'à ce qu'ils puissent être gérés à mesure que les threads deviennent disponibles.

Vous pouvez implémenter votre propre pool de threads, mais il est plus facile d'utiliser le pool de threads fourni par .NET Framework par le biais de la classe ThreadPool.

Avec la mise en pool de threads, vous appelez la méthode ThreadPool.QueueUserWorkItem avec un délégué pour la procédure à exécuter, et Visual Basic ou C# crée le thread et exécute votre procédure.

Exemple de mise en pool de threads

L'exemple ci-après montre comment utiliser la mise en pool de threads pour lancer plusieurs tâches.

Public Sub DoWork()
    ' Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf SomeLongTask))
    ' Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf AnotherLongTask))
End Sub
Private Sub SomeLongTask(ByVal state As Object)
    ' Insert code to perform a long task.
End Sub
Private Sub AnotherLongTask(ByVal state As Object)
    ' Insert code to perform another long task.
End Sub
public void DoWork()
{
    // Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(SomeLongTask));
    // Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(AnotherLongTask));
}

private void SomeLongTask(Object state)
{
    // Insert code to perform a long task.
}

private void AnotherLongTask(Object state)
{
    // Insert code to perform a long task.
}

L'un des avantages de la mise en pool de threads réside dans le fait que vous pouvez transmettre les arguments d'un objet d'état à la procédure de la tâche. Si la procédure que vous appelez exige plusieurs arguments, vous pouvez transtyper (cast) une structure ou une instance de classe en type de données Object.

Paramètres des pools de thread et valeurs de retour

Le renvoi de valeurs à partir d'un thread ThreadPool n'est pas simple. La méthode standard pour renvoyer des valeurs à partir d'un appel de fonction n'est pas admise, car les procédures Sub constituent le seul type de procédure à pouvoir être mis en file d'attente vers un pool de threads. L'une des méthodes de transmission des paramètres et des valeurs de retour consiste à encapsuler les paramètres, les valeurs de retour et les méthodes dans une classe wrapper, comme indiqué dans Paramètres et valeurs de retour pour les procédures multithread (C# et Visual Basic).

Une méthode plus simple consiste à fournir des paramètres et des valeurs de retour à l'aide de la variable objet état ByVal (facultative) de la méthode QueueUserWorkItem. Si vous utilisez cette variable pour transmettre une référence à une instance de classe, les membres de l'instance peuvent être modifiés par le thread ThreadPool et utilisés comme valeurs de retour.

À première vue, il ne vous semble peut-être pas évident de pouvoir modifier un objet référencé par une variable transmise par valeur. Il est possible de le faire, car seule la référence d'objet est transmise par valeur. Lorsque vous apportez des modifications aux membres de l'objet désigné par la référence d'objet, celles-ci s'appliquent à l'instance de la classe réelle.

Les structures ne peuvent pas être employées pour renvoyer des valeurs dans les objets état. Étant donné que les structures représentent des types valeur, les modifications que le processus asynchrone effectue n'ont aucune incidence sur les membres de la structure d'origine. Utilisez des structures pour fournir des paramètres lorsque les valeurs de retour ne sont pas nécessaires.

Voir aussi

Tâches

Comment : utiliser un pool de threads (C# et Visual Basic)

Référence

Threads (C# et Visual Basic)

Synchronisation des threads (C# et Visual Basic)

QueueUserWorkItem

System.Threading

ThreadPool

Concepts

Applications multithread (C# et Visual Basic)

Autres ressources

Comment faire pour envoyer un élément de travail pour le pool de threads à l'aide Visual C#