Microsoft.Extensions.ObjectPool er en del af ASP.NET Core-infrastrukturen, der understøtter at holde et sæt objekter i hukommelsen til genbrug i stedet for at tillade garbage collection af objekter. Hvis de objekter, du vil administrere, er det, kan du få brug for at bruge objektpuljer:
- Allokering/initialisering er dyrt.
- Det repræsenterer en begrænset ressource.
- Brug det forudsigeligt og ofte.
Genanvendelse er et vigtigt emne og et uundgåeligt problem, som vi ofte støder på i vores daglige udvikling.
For at tage det simpleste og mest velkendte eksempel, er databaseforbindelsespuljer genbrugte databaseforbindelser.
Så hvad er pointen med genbrug?
Kort sagt reducerer det unødvendigt ressourcetab.
Ud over databaseforbindelser kan der være mange andre objekter, der skal genbruges under forskellige scenarier eller krav, og der findes en såkaldt Objektpulje.
Du burde selv have implementeret lignende funktioner, enten med ConcurrentBag, ConcurrentQueue eller med andre løsninger.
Dette deler også en implementering i Microsoft-dokumentationen
Sådan opretter du en objektpulje ved at bruge en ConcurrentBag
Hyperlink-login er synlig.
Selvfølgelig har Microsoft i .NET Core hjulpet os med at implementere en simpel Object Pool.
Først opretter du et nyt .NET Core-konsolprojekt og bruger nuget-kommandoen til at tilføje følgende pakke:
Al kode er som følger:
Anvendelse 1
Før vi opretter en pool, skal vi definere en politik. Her bruger vi direkte den inkluderede DefaultPooledObjectPolicy til at konstruere den.
Objektpuljen vil have et maksimalt antal tråde vedligeholdt.
Brug Get-metoden for poolobjektet til at tage et objekt ud af objektpoolen.
Ovenstående kode kø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 AM #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 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 AM Dette resultat viser, at objekterne i Objektpuljen er direkte nye, og nogle egenskaber er ikke devaluerede, hvilket ofte ikke har meget praktisk betydning på nuværende tidspunkt.
Fordi DefaultPooledObjectPolicy er et nyt objekt direkte, er det ofte ikke, hvad vi forventer!
Hvis du vil opfylde vores faktiske anvendelse, skal du selv fastlægge en police!
Lad os se på brug 2
Anvendelse 2
Create-metoden bruges til at oprette Demo-objektet, og Return-metoden er at smide Demo-objektet tilbage i Object Pool (lånt og returneret).
Objektpuljen defineres her til kun at indeholde ét objekt.
Da der er en ét-trins returoperation efter at have taget den ud af objektpuljen, bør element1 og item2 være det samme objekt.
Efter at have fjernet element2 fra objektpuljen, returneres den ikke, så objektpuljen opretter et nyt objekt baseret på den politik, vi har defineret.
Her er outputresultatet af brug 2:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15/4/2020 03:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15/4/2020 03:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15/4/2020 03:31:15
False Du kan se, at de individuelle egenskaber for element1, item2 og item3 er de samme, og item1 og item2 faktisk er det samme objekt. Item3 og item1 er ikke det samme.
Anvendelse 3
Du kan se, at element1 og item2 er det samme objekt. Når du henter et objekt fra Objektpuljen, tages det første, så hvis du returnerer det og henter det igen, får du stadig originalen først.
item3 tages direkte fra Objektpuljen der og oprettes ikke igen, fordi Objektpuljen her vedligeholder flere objekter, ikke kun ét i brug 2, så det tages direkte fra Puljen.
Her er outputresultatet
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15/4/2020 03:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15/4/2020 03:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15/4/2020 03:33:58
False Ligesom i brug 2, essensen er den samme.
Anvendelse 4
Det virker som om, at ovenstående brug ikke ligner vores normale brug. Vi er stadig nødt til at stole på injektion.
Så lad os endelig se på, hvordan man kombinerer afhængighedsinjektion. Selvfølgelig er essensen her stadig uadskillelig fra de to ting Police og Provider.
Vi skal først registrere Provideren og derefter direkte tage dens instans til at oprette en Object Pool.
Hvis du vil bruge det et andet sted, kan du injicere det gennem konstruktøren.
Resultatet her er også det samme som før, der er ikke meget at sige.
resumé
Men uanset hvilken slags brug det er, skal vi forstå, at Objektpool er uadskillelig fra de tre personer i Pool, Policy og Provider.
Med de her tre kan vi måske gøre, hvad vi vil.
Selvfølgelig tilbyder den også flere særlige ting, som du kan tjekke ud, hvis du er interesseret.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|