Microsoft.Extensions.ObjectPool er en del av ASP.NET Core-infrastrukturen som støtter å holde et sett objekter i minnet for gjenbruk i stedet for å tillate søppelinnsamling av objekter. Hvis objektene du vil administrere er det, kan det hende du må bruke objektpooler:
- Allokering/initialisering er kostbart.
- Representerer en begrenset ressurs.
- Bruk det forutsigbart og ofte.
Gjenbruk er et viktig tema og et uunngåelig problem vi ofte møter i vår daglige utvikling.
For å ta det enkleste og mest kjente eksempelet, er databasetilkoblingspooler gjenbrukte databaseforbindelser.
Så hva er poenget med gjenbruk?
Enkelt sagt reduserer det unødvendig ressurstap.
I tillegg til databasetilkoblinger kan det være mange andre objekter som må gjenbrukes under ulike scenarioer eller krav, og det finnes en såkalt objektpool.
Du burde ha implementert lignende funksjoner selv, enten med ConcurrentBag, ConcurrentQueue eller med andre løsninger.
Dette deler også en implementering i Microsoft-dokumentasjonen
Hvordan: Opprette en objektpool ved å bruke en ConcurrentBag
Innloggingen med hyperkoblingen er synlig.
Selvfølgelig har Microsoft hjulpet oss med å implementere en enkel objektpool i .NET Core.
Først, lag et nytt .NET Core-konsollprosjekt og bruk nuget-kommandoen for å legge til følgende pakke:
All kode er som følger:
Bruk 1
Før vi oppretter en pool, må vi definere en policy. Her bruker vi direkte den medfølgende DefaultPooledObjectPolicy for å konstruere den.
Objektpoolen vil ha et maksimalt antall tråder som opprettholdes.
Bruk Get-metoden til pool-objektet for å ta et objekt ut av objekt-poolen.
Koden ovenfor kjører resultatet
#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:00 #3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00:00 AM #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 AM #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 AM #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 Dette resultatet viser at objektene i objektpoolen er direkte nye, og noen egenskaper er ikke devaluert, noe som ofte ikke har mye praktisk betydning på nåværende tidspunkt.
Fordi DefaultPooledObjectPolicy er et nytt objekt direkte, er dette ofte ikke det vi forventer!
Hvis du vil møte vår faktiske bruk, må du selv definere en forsikring!
La oss se på bruk 2
Bruk 2
Create-metoden brukes til å lage Demo-objektet, og Return-metoden er å kaste Demo-objektet tilbake i Object Pool (lånt og returnert).
Objektpoolen er her definert til å inneholde kun ett objekt.
Siden det er en ettstegs returoperasjon etter å ha tatt den ut av objektpoolen, skal element1 og item2 være det samme objektet.
Etter å ha tatt element2 ut av objektpoolen, returneres den ikke, så objektpoolen vil opprette et nytt objekt basert på policyen vi definerte.
Her er utgangsresultatet av bruk 2:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 03:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 03:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 03:31:15
False Du kan se at de individuelle egenskapene til element1, item2 og item3 er de samme, og item1 og item2 faktisk er det samme objektet. Element3 og item1 er ikke det samme.
Bruk 3
Du kan se at element1 og item2 er det samme objektet. Når du henter et objekt fra objektpoolen, blir det første tatt, så hvis du returnerer det og henter det igjen, får du fortsatt originalen først.
item3 tas direkte fra objektpoolen der og opprettes ikke igjen, fordi objektpoolen her vedlikeholder flere objekter, ikke bare ett i bruk 2, så det tas direkte fra poolen.
Her er utgangsresultatet
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15.04.2020 03:33:58
False Samme som i bruk 2, essensen er den samme.
Bruk 4
Det virker som om bruken ovenfor ikke er så lik vår vanlige bruk. Vi må fortsatt stole på injeksjon.
Så la oss endelig se på hvordan man kan kombinere avhengighetsinjeksjon. Selvfølgelig er essensen her fortsatt uatskillelig fra de to tingene Polise og Leverandør.
Vi må først registrere Provideren, og deretter ta instansen direkte for å opprette en Object Pool.
Hvis du vil bruke det et annet sted, kan du injisere det gjennom konstruktøren.
Resultatet her er også det samme som før, det er ikke så mye å si.
sammendrag
Men uansett hvilken type bruk det er, må vi forstå at Object Pool er uatskillelig fra de tre aktørene Pool, Policy og Provider.
Med disse tre kan vi kanskje gjøre hva vi vil.
Selvfølgelig tilbyr den også flere spesielle ting som du kan sjekke ut hvis du er interessert.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|