Microsoft.Extensions.ObjectPool fa parte dell'infrastruttura ASP.NET Core che supporta il mantenimento di un insieme di oggetti in memoria per il riutilizzo invece di permettere la raccolta dei rifiuti degli oggetti. Se gli oggetti che vuoi gestire sono, potresti dover utilizzare pool di oggetti:
- L'allocazione/inizializzazione è costosa.
- Rappresenta una risorsa limitata.
- Usalo in modo prevedibile e frequente.
Il riutilizzo è un argomento importante e un problema inevitabile che spesso incontriamo nel nostro sviluppo quotidiano.
Per prendere l'esempio più semplice e familiare, i pool di connessione a database sono connessioni a database riutilizzate.
Quindi, qual è il senso del riutilizzo?
In parole povere, riduce le perdite inutili di risorse.
Oltre alle connessioni al database, possono esserci molti altri oggetti che devono essere riutilizzati in diversi scenari o requisiti, e esiste un cosiddetto Object Pool.
Dovresti aver implementato funzioni simili da solo, sia con ConcurrentBag, sia con ConcurrentQueue, sia con altre soluzioni.
Questo condivide anche un'implementazione nella documentazione Microsoft
Come: Creare un pool di oggetti usando un ConcurrentBag
Il login del link ipertestuale è visibile.
Naturalmente, in .NET Core, Microsoft ci ha aiutato a implementare un semplice Object Pool.
Per prima cosa, crea un nuovo progetto console .NET Core e usa il comando nuget per aggiungere il seguente pacchetto:
Tutto il codice è il seguente:
Utilizzo 1
Prima di creare un pool, dobbiamo definire una Politica. Qui usiamo direttamente il DefaultPooledObjectPolicy incluso per costruirlo.
Il pool di oggetti avrà un numero massimo di thread mantenuti.
Usa il metodo Get dell'oggetto del pool per estrarre un oggetto dal pool di oggetti.
Il codice sopra esegue il risultato
#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00:00 #2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 00:00:00 #3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00:00 #4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 00:00:00 #5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 00:00:00 #6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 00:00:00 #7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 00:00:00 #8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 00:00:00 #9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1/1/0001 00:00:00 #10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 00:00:00 Questo risultato mostra che gli oggetti nel Object Pool sono direttamente rinnovati e alcune proprietà non vengono svalutate, cosa che spesso non ha molto significato pratico in questo momento.
Poiché DefaultPooledObjectPolicy è un oggetto nuovo direttamente, molte volte non è quello che ci aspettiamo!
Se vuoi soddisfare il nostro utilizzo reale, devi definire tu stesso una polizza!
Diamo un'occhiata all'uso 2
Utilizzo 2
Il metodo Create viene utilizzato per creare l'oggetto Demo, mentre il metodo Return è per riportare l'oggetto Demo nel Object Pool (preso in prestito e restituito).
Il pool di oggetti è definito qui per contenere un solo oggetto.
Poiché c'è un'operazione di ritorno in un solo passaggio dopo averlo estratto dal pool di oggetti, l'item1 e l'item2 dovrebbero essere lo stesso oggetto.
Dopo aver estratto l'elemento2 dal pool di oggetti, non viene restituito, quindi il pool creerà un nuovo oggetto basandosi sulla policy che abbiamo definito.
Ecco il risultato dell'uscita dell'uso 2:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15/4/2020 3:31:15 AM 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15/4/2020 3:31:15 AM
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15/04/2020 3:31:15 AM
False Puoi vedere che le proprietà individuali di item1, item2 e elemento3 sono le stesse, e item1 e item2 sono effettivamente lo stesso oggetto. Item3 e point1 non sono la stessa cosa.
Utilizzo 3
Puoi vedere che item1 e item2 sono lo stesso oggetto. Quando recuperi un oggetto dal Pool di Oggetti, il primo verrà preso, quindi se lo restituisci e lo recuperi di nuovo, riceverai comunque l'originale per primo.
l'item3 viene preso direttamente dal Pool di Oggetti lì e non viene creato di nuovo, perché il Pool di Oggetti qui mantiene più oggetti, non solo uno in uso 2, quindi viene preso direttamente dal Pool.
Ecco il risultato di output
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-4/15/2020 3:33:58 AM f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-4/15/2020 3:33:58 AM
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-4/15/2020 3:33:58 AM
False Come l'uso 2, l'essenza è la stessa.
Utilizzo 4
Sembra che l'uso sopra citato non sia così simile al nostro uso normale. Dobbiamo ancora affidarci all'iniezione.
Quindi, finalmente vediamo come combinare l'iniezione di dipendenza. Naturalmente, l'essenza qui è ancora inseparabile dalle due cose di Polizza e Fornitore.
Prima dobbiamo registrare il Provider, e poi prendere direttamente la sua istanza per creare un Object Pool.
Se vuoi usarlo altrove, puoi iniettarlo tramite il costruttore.
Il risultato qui è lo stesso di prima, non c'è molto da dire.
sommario
Ma qualunque sia il tipo di utilizzo, dobbiamo capire che Object Pool è inseparabile dai tre ragazzi di Pool, Policy e Provider.
Con questi tre, forse possiamo fare quello che vogliamo.
Naturalmente, offre anche diverse cose speciali che puoi provare se sei interessato.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|