Comment utiliser le modèle de conception de pool d'objets en C #

Lors de la création d'applications, vous rencontrez souvent des objets assez coûteux à créer. Dans certains scénarios, le coût de création de nouveaux objets est suffisamment élevé pour avoir un impact sur les performances de l'application. C'est là que le modèle de conception du pool d'objets vient à la rescousse. 

Le modèle de conception de pool d'objets est un modèle de conception de création utilisé pour recycler les objets plutôt que de les recréer chaque fois que l'application en a besoin. En conservant les instances d'objets réutilisables dans un pool de ressources et en les distribuant selon les besoins, ce modèle permet de minimiser la surcharge de l'initialisation, de l'instanciation et de la suppression des objets et d'améliorer les performances de votre application.

Lorsque l'application demande un objet et que l'objet est disponible dans le pool, il est renvoyé depuis le pool. Si l'objet du type demandé n'est pas disponible dans le pool, une nouvelle instance de l'objet est créée et renvoyée. Lorsque l'application n'a plus besoin de l'objet, l'objet est renvoyé au pool.

Le nombre minimum et maximum d'objets qu'un pool d'objets peut contenir est configurable. Si l'application a besoin d'un objet du pool mais que le nombre maximal d'objets a été alloué, une implémentation de pool d'objets personnalisé typique peut adopter une ou plusieurs des stratégies suivantes:

  1. Renvoyer null ou lancer une exception
  2. Bloquer l'appel jusqu'à ce qu'un objet soit disponible
  3. Augmentez la taille de la piscine pour accueillir plus d'objets

Un pool d'objets est similaire au pool de connexions à la base de données. Tout comme le pool de connexions contrôle le nombre maximum de connexions à la base de données, le pool d'objets contrôle le nombre d'instances de classe que l'application utilisera.

Création d'un pool d'objets génériques en C #

Maintenant que nous connaissons les bases, passons à l'implémentation. Lors de l'implémentation du modèle de conception du pool d'objets, nous devons prendre en compte la réutilisabilité, la simplicité, la configurabilité et même des facteurs tels que la sécurité des threads.

Dans cet exemple, nous allons profiter d'une ConcurrentBag classe pour stocker des objets. Notez que la ConcurrentBagclasse dans l' System.Collections.Concurrentespace de noms fournit une collection d'éléments sans verrouillage, sans thread et non ordonnés. Notez également que l'insertion et la suppression d'objets vers et depuis a ConcurrentBagest très rapide, en particulier si le même thread tente d'insérer et de supprimer des éléments de la collection en même temps.

Voici la structure de notre ObjectPoolclasse personnalisée . Notez l'utilisation de l' ConcurrentBaginstance pour stocker les objets.

Public class ObjectPool où T: new ()

    {

        private readonly ConcurrentBag items = new ConcurrentBag ();

        compteur int privé = 0;

        int privé MAX = 10;

        Public void Release (T item)

        {

            //FAIRE          

        }

        public T Get ()

        {

           //FAIRE

        }

    }

L'extrait de code suivant illustre une implémentation de la Getméthode. La Getméthode retourne une instance du pool d'objets si elle est disponible. Si aucun n'est disponible, un nouvel objet est créé et renvoyé. Dans ces deux scénarios, la countervariable est augmentée ou diminuée selon le cas. Notez que parce que nous utilisons une collection simultanée, c'est- ConcurrentBagà- dire que dans cet exemple, la concurrence est prise en charge.

public T Get ()

        {

            Élément T;

            if (items.TryTake (out item))

            {

                compteur-;

                retourner l'objet;

            }

            autre

            {

                T obj = nouveau T ();

                items.Add (obj);

                counter ++;

                return obj;

            }

        }

La MAXvariable entière est ici codée en dur, mais vous pouvez la rendre configurable. Cette classe n'est ni scellée ni statique, vous pouvez donc l'étendre à votre guise.

La Releaseméthode est utilisée pour libérer les objets qui ne sont plus nécessaires dans le pool d'objets. Il vérifie si la valeur de la countervariable est inférieure à la valeur de la MAXvariable, et si c'est le cas, ajoute l'objet qui lui est passé en tant que paramètre de la collection.

Public void Release (T item)

        {

            si (compteur <MAX)

            {

                items.Add (item);

                counter ++;

            }           

        }

En supposant que vous ayez créé une classe appelée MyClass, voici comment vous pouvez l'ajouter au pool d'objets à l'aide de la ObjectPoolclasse.

static void Main (string [] args)

        {

            ObjectPool objPool = new ObjectPool ();

            MyClass obj = objPool.Get ();

            objPool.Release (obj);

            Console.Read ();

        }

Vous pouvez modifier cette implémentation de pool d'objets personnalisé pour autoriser la lecture des tailles minimale et maximale du pool à partir d'un fichier de configuration. Dans le cadre de l'initialisation du pool d'objets, vous pouvez également vous assurer que le pool contient le nombre minimum d'objets.

Les pools d'objets aident à réduire la surcharge des ressources lorsque vous avez besoin de plusieurs instances d'une classe qui sont coûteuses à créer ou à gérer. Si votre application implique d'instancier les mêmes classes encore et encore, utilisez ce modèle de conception pour garantir des performances optimales.