Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 30226|Antwoord: 1

[.NET Core] Gedetailleerde uitleg van Object Pool in .NET Core

[Link kopiëren]
Geplaatst op 15-4-2020 17:38:34 | | | |
Microsoft.Extensions.ObjectPool maakt deel uit van de ASP.NET Core-infrastructuur die het bewaren van een set objecten in het geheugen ondersteunt voor hergebruik in plaats van garbage collection van objecten toe te staan.
Als de objecten die je wilt beheren dat zijn, moet je mogelijk objectpools gebruiken:

  • Allocatie/initialisatie is kostbaar.
  • Vertegenwoordigt een beperkte hulpbron.
  • Gebruik het voorspelbaar en vaak.


Hergebruik is een belangrijk onderwerp en een onvermijdelijk probleem dat we vaak tegenkomen in onze dagelijkse ontwikkeling.

Om het eenvoudigste en meest bekende voorbeeld te nemen: databaseverbindingspools zijn hergebruikte databaseverbindingen.

Dus wat is het nut van hergebruik?

Simpel gezegd vermindert het onnodig verlies van grondstoffen.

Naast databaseverbindingen kunnen er veel andere objecten zijn die onder verschillende scenario's of eisen hergebruikt moeten worden, en er is een zogenaamde Object Pool.

Je had vergelijkbare functies zelf moeten implementeren, met ConcurrentBag, ConcurrentQueue of met andere oplossingen.

Dit deelt ook een implementatie in de Microsoft-documentatie

Hoe maak je een objectpool aan door een ConcurrentBag te gebruiken

De hyperlink-login is zichtbaar.

Natuurlijk heeft Microsoft ons in .NET Core geholpen met het implementeren van een eenvoudige Object Pool.

Maak eerst een nieuw .NET Core-consoleproject aan en gebruik het nuget-commando om het volgende pakket toe te voegen:

Alle code is als volgt:

Gebruik 1



Voordat we een pool maken, moeten we een beleid definiëren. Hier gebruiken we direct de meegeleverde DefaultPooledObjectPolicy om het te construeren.

De objectpool zal een maximaal aantal threads onderhouden hebben.

Gebruik de Get-methode van het poolobject om een object uit de objectpool te halen.

De bovenstaande code voert het resultaat uit

#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00:00 uur
#2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 00:00:00 uur
#3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00:00 uur
#4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 00:00:00 uur
#5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 00:00:00 uur
#6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 00:00:00 uur
#7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 00:00:00 uur
#8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 00:00:00 uur
#9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1/1/0001 00:00:00 uur
#10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 00:00:00 uur
Dit resultaat toont aan dat de objecten in de Object Pool direct nieuw zijn, en sommige eigenschappen zijn niet gedevalueerd, wat op dit moment vaak weinig praktische betekenis heeft.

Omdat DefaultPooledObjectPolicy direct een nieuw object is, is dit vaak niet wat we verwachten!

Als je aan ons daadwerkelijke gebruik wilt voldoen, moet je zelf een polis opstellen!

Laten we eens kijken naar gebruik 2

Gebruik 2

De Create-methode wordt gebruikt om het Demo-object te maken, en de Return-methode is om het Demo-object terug te gooien in de Object Pool (geleend en teruggegeven).



De objectpool is hier gedefinieerd om slechts één object te bevatten.

Omdat er een eenstapsretouroperatie is nadat het uit de objectpool is gehaald, zouden item1 en item2 hetzelfde object moeten zijn.

Nadat item2 uit de objectpool is gehaald, wordt het niet teruggegeven, dus zal de objectpool een nieuw object aanmaken op basis van het beleid dat we hebben gedefinieerd.

Hier is het uitvoerresultaat van gebruik 2:

985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15-4-2020 03:31:15 uur
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15-4-2020 03:31:15 uur
True
8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15-4-2020 03:31:15 uur
False
Je kunt zien dat de individuele eigenschappen van item1, item2 en item3 hetzelfde zijn, en item1 en item2 inderdaad hetzelfde object zijn. Item3 en item1 zijn niet hetzelfde.


Gebruik 3

Je kunt zien dat item1 en item2 hetzelfde object zijn. Bij het ophalen van een object uit de Object Pool wordt het eerste object genomen, dus als je het terugbrengt en opnieuw ophaalt, krijg je nog steeds het origineel als eerste.



item3 wordt direct uit de Object Pool daar gehaald en niet opnieuw aangemaakt, omdat de Object Pool hier meerdere objecten bijhoudt, niet slechts één in gebruik 2, dus het wordt direct uit de Pool gehaald.

Hier is het uitvoerresultaat

f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15-4-2020 03:33:58 uur
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15-4-2020 03:33:58 uur
True
b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15-4-2020 03:33:58 uur
False
Net als bij gebruik 2 is de essentie hetzelfde.

Gebruik 4

Het lijkt erop dat het bovenstaande gebruik niet zo vergelijkbaar is met ons normale gebruik. We moeten nog steeds op injecties vertrouwen.

Laten we dus eindelijk kijken hoe je afhankelijkheidsinjectie kunt combineren. Natuurlijk is de essentie hier nog steeds onlosmakelijk verbonden met de twee zaken Polissen en Aanbieder.



We moeten eerst de Provider registreren en vervolgens direct zijn instantie gebruiken om een Object Pool aan te maken.

Als je het elders wilt gebruiken, kun je het via de constructor injecteren.

Het resultaat hier is ook hetzelfde als voorheen, er valt niet veel over te zeggen.

samenvatting

Maar ongeacht het soort gebruik, moeten we begrijpen dat Object Pool onlosmakelijk verbonden is met de drie mensen van Pool, Policy en Provider.

Met deze drie kunnen we misschien doen wat we willen.

Natuurlijk biedt het ook verschillende speciale dingen die je kunt bekijken als je geïnteresseerd bent.

LeakTrackingObjectPool

StringBuilderPooledObjectPolicy





Vorig:Inleiding tot Webservicesverbeteringen (WSE) 3.0
Volgend:Hoe vindt Visual Studio 2013 content die meerdere regels vervangt?
 Huisbaas| Geplaatst op 30-8-2023 18:34:07 |
DefaultObjectPool wordt gebruikt op het onderliggende niveauConcurrentQueueImplementatie van thread security queue, de broncode is als volgt:


De hyperlink-login is zichtbaar.


Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com