Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 30226|Risposta: 1

[.NET Core] Spiegazione dettagliata dell'Object Pool in .NET Core

[Copiato link]
Pubblicato il 15-04-2020 17:38:34 | | | |
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





Precedente:Introduzione ai Miglioramenti dei Web Services (WSE) 3.0
Prossimo:Come fa Visual Studio 2013 a trovare contenuti che sostituiscono più righe?
 Padrone di casa| Pubblicato il 30-8-2023 18:34:07 |
DefaultObjectPool viene utilizzato a livello sottostanteConcurrentQueueImplementazione della coda di sicurezza dei thread, il codice sorgente è il seguente:


Il login del link ipertestuale è visibile.


Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com