Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 30226|Respuesta: 1

[.NET Core] Explicación detallada del Object Pool en .NET Core

[Copiar enlace]
Publicado el 15-4-2020 17:38:34 | | | |
Microsoft.Extensions.ObjectPool forma parte de la infraestructura ASP.NET Core que permite mantener un conjunto de objetos en memoria para su reutilización en lugar de permitir la recolección de objetos de basura.
Si los objetos que quieres gestionar son, puede que necesites usar pools de objetos:

  • La asignación/inicialización es costosa.
  • Representa un recurso limitado.
  • Úsalo de forma predecible y frecuente.


La reutilización es un tema importante y un problema inevitable que a menudo encontramos en nuestro desarrollo diario.

Para tomar el ejemplo más simple y familiar, los pools de conexiones a bases de datos son conexiones a bases de datos reutilizadas.

¿Cuál es entonces el sentido de reutilizar?

En pocas palabras, reduce la pérdida innecesaria de recursos.

Además de las conexiones a bases de datos, puede haber muchos otros objetos que necesiten ser reutilizados bajo diferentes escenarios o requisitos, y existe un llamado Object Pool.

Deberías haber implementado funciones similares tú mismo, ya sea con ConcurrentBag, ConcurrentQueue o con otras soluciones.

Esto también comparte una implementación en la documentación de Microsoft

Cómo hacerlo: Crear un pool de objetos usando un ConcurrentBag

El inicio de sesión del hipervínculo es visible.

Por supuesto, en .NET Core, Microsoft nos ha ayudado a implementar un simple Object Pool.

Primero, crea un nuevo proyecto de consola .NET Core y usa el comando nuget para añadir el siguiente paquete:

Todo el código es el siguiente:

Uso 1



Antes de crear un pool, necesitamos definir una Política. Aquí usamos directamente el DefaultPooledObjectPolicy incluido para construirlo.

El conjunto de objetos mantendrá un número máximo de hilos.

Utiliza el método Get del objeto del pool para sacar un objeto del pool de objetos.

El código anterior ejecuta el resultado

#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00:00 AM
#2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 00:00 AM
#3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00 AM
#4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 00:00:00 AM
#5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 00:00 AM
#6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 00:00 AM
#7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 00:00:00 AM
#8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 00:00:00 AM
#9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1/1/0001 00:00:00 AM
#10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 00:00:00 AM
Este resultado muestra que los objetos del Conjunto de Objetos se renuevan directamente, y algunas propiedades no se devaluan, lo que a menudo no tiene mucho significado práctico en este momento.

Como DefaultPooledObjectPolicy es un objeto nuevo directamente, muchas veces esto no es lo que esperamos.

Si quieres cumplir con nuestro uso real, ¡tienes que definir tú mismo una política!

Veamos el uso 2

Uso 2

El método Create se utiliza para crear el objeto Demo, y el método Return es devolver el objeto Demo al Object Pool (tomado prestado y devuelto).



El conjunto de objetos se define aquí para contener solo un objeto.

Dado que hay una operación de retorno de un solo paso tras sacarla del conjunto de objetos, el elemento1 y el elemento2 deben ser el mismo objeto.

Después de sacar el elemento2 del conjunto de objetos, no se devuelve, por lo que el conjunto creará un nuevo objeto según la política que definimos.

Aquí está el resultado de salida del uso 2:

15/04/985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com 2020 3:31:15 AM
15/04/985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com 2020 3:31:15 AM
True
15/04/8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com de 2020 3:31:15 AM
False
Puedes ver que las propiedades individuales de los elementos1, elemento2 y elemento3 son las mismas, y que los elementos1 y elemento2 son, efectivamente, el mismo objeto. El punto 3 y el punto 1 no son lo mismo.


Uso 3

Puedes ver que el item1 y el item2 son el mismo objeto. Al recuperar un objeto del Object Pool, se llevará el primero, así que si lo devuelves y lo recuperas de nuevo, seguirás recibiendo el original primero.



el item3 se toma directamente del Object Pool allí y no se vuelve a crear, porque el Object Pool aquí mantiene múltiples objetos, no solo uno en uso 2, así que se toma directamente del Pool.

Aquí está el resultado de salida

15/04/f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com 2020 3:33:58
15/04/f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com 2020 3:33:58
True
15/04/b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com 2020 3:33:58 AM
False
Igual que el uso 2, la esencia es la misma.

Uso 4

Parece que el uso anterior no es tan similar a nuestro uso habitual. Todavía tenemos que depender de la inyección.

Así que, por fin, veamos cómo combinar la inyección de dependencia. Por supuesto, la esencia aquí sigue siendo inseparable de las dos cosas de la póliza y el proveedor.



Primero necesitamos registrar al Proveedor y luego tomar directamente su instancia para crear un Object Pool.

Si quieres usarlo en otro sitio, puedes inyectarlo a través del constructor.

El resultado aquí también es el mismo que antes, no hay mucho que decir.

resumen

Pero sea cual sea el tipo de uso, debemos entender que el Object Pool es inseparable de los tres que son Pool, Policy y Provider.

Con estos tres, quizá podamos hacer lo que queramos.

Por supuesto, también ofrece varias cosas especiales que puedes probar si te interesa.

LeakTrackingObjectPool

StringBuilderPooledObjectPolicy





Anterior:Introducción a las mejoras de servicios web (WSE) 3.0
Próximo:¿Cómo encuentra Visual Studio 2013 contenido que sustituye a varias líneas?
 Propietario| Publicado el 30-8-2023 18:34:07 |
DefaultObjectPool se utiliza en el nivel subyacenteConcurrentQueueImplementación de la cola de seguridad de hilos, el código fuente es el siguiente:


El inicio de sesión del hipervínculo es visible.


Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com