Microsoft.Extensions.ObjectPool on osa ASP.NET Core -infrastruktuuria, joka tukee objektien säilyttämistä muistissa uudelleenkäyttöä varten sen sijaan, että sallittaisiin objektien roskien kerääminen. Jos haluamasi objektit ovat, saatat tarvita objektipoolia:
- Kohdentaminen/alustus on kallista.
- Edustaa rajallista resurssia.
- Käytä ennustettavasti ja usein.
Uudelleenkäyttö on tärkeä aihe ja väistämätön ongelma, johon usein törmäämme päivittäisessä kehityksessämme.
Yksinkertaisin ja tutuin esimerkki on, että tietokantayhteysaltaat ovat uudelleenkäytettyjä tietokantayhteyksiä.
Mikä siis on uudelleenkäytön tarkoitus?
Yksinkertaisesti sanottuna se vähentää tarpeetonta resurssien menetystä.
Tietokantayhteyksien lisäksi voi olla monia muita objekteja, joita täytyy käyttää uudelleen eri tilanteissa tai vaatimuksissa, ja on olemassa ns. Object Pool.
Sinun olisi pitänyt toteuttaa vastaavat toiminnot itse, joko ConcurrentBagilla, ConcurrentQueuella tai muilla ratkaisuilla.
Tämä jakaa myös Microsoftin dokumentaation toteutuksen.
Miten: Luoda objektipooli käyttämällä ConcurrentBagia
Hyperlinkin kirjautuminen on näkyvissä.
Tietenkin .NET Coressa Microsoft on auttanut meitä toteuttamaan yksinkertaisen Object Poolin.
Luo ensin uusi .NET Core -konsoliprojekti ja käytä nuget-komentoa seuraavan paketin lisäämiseen:
Kaikki koodit ovat seuraavat:
Käyttö 1
Ennen poolin luomista meidän täytyy määritellä politiikka. Tässä käytämme suoraan mukana olevaa DefaultPooledObjectPolicyä sen rakentamiseen.
Objektipoolilla on maksimimäärä säikeitä yllätettynä.
Käytä pool-objektin Get-metodia ottaaksesi objektin pois objektipoolista.
Yllä oleva koodi suorittaa tuloksen
#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 Tämä tulos osoittaa, että Object Poolin objektit uusitaan suoraan, eikä joidenkin ominaisuuksien arvo ole alennettu, mikä ei usein tällä hetkellä ole kovin käytännöllistä merkitystä.
Koska DefaultPooledObjectPolicy on uusi olio suoraan, monesti tämä ei ole sitä, mitä odotamme!
Jos haluat täyttää todellisen käyttömme, sinun täytyy määritellä vakuutus itse!
Katsotaanpa käyttöä 2
Käyttö 2
Create-menetelmää käytetään Demo-objektin luomiseen, ja Return-menetelmänä Demo-olio heitetään takaisin Object Pooliin (lainattuna ja palautetunaan).
Objektipooli määritellään tässä sisältämään vain yhden objektin.
Koska objektipoolista poistettuna on yhden vaiheen palautusoperaatio, kohde 1 ja alkio 2 ovat sama objekti.
Kun kohde 2 otetaan pois objektipoolista, sitä ei palauteta, joten objektipooli luo uuden objektin määrittelemän politiikan perusteella.
Tässä on käytön 2 tulos:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.4.2020 klo 3:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.4.2020 klo 3:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.4.2020 klo 3:31:15
False Näet, että yksittäisten elementtien 1, alkion 2 ja alkion 3 ominaisuudet ovat samat, ja kohteet 1 ja 2 ovat todellakin sama objekti. Item3 ja item1 eivät ole sama asia.
Käyttö 3
Näet, että kohde 1 ja esine 2 ovat sama objekti. Kun haet esineen Object Poolista, ensimmäinen otetaan mukaan, joten jos palautat sen ja haet sen uudelleen, saat silti alkuperäisen ensimmäisenä.
item3 otetaan suoraan Object Poolista eikä sitä luoda uudelleen, koska Object Pool ylläpitää useita objekteja, ei vain yhtä käyttö 2:ssa, joten se otetaan suoraan Poolista.
Tässä on tulostulos
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.4.2020 klo 3:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.4.2020 klo 3:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15.4.2020 klo 3:33:58
False Sama kuin käyttö 2:ssa, olemus on sama.
Käyttö 4
Vaikuttaa siltä, että yllä oleva käyttö ei ole kovin samanlainen kuin meidän normaali käyttömme. Meidän täytyy silti luottaa injektioon.
Katsotaanpa lopuksi, miten riippuvuusinjektio yhdistetään. Tietenkin tässä olennaisuus on edelleen erottamaton kahdesta asiasta: politiikasta ja palveluntarjoajasta.
Meidän täytyy ensin rekisteröidä palveluntarjoaja ja ottaa sen instanssi suoraan luodaksemme Object Poolin.
Jos haluat käyttää sitä muualla, voit injektoida sen konstruktorin kautta.
Tulos on tässäkin sama kuin ennen, ei ole paljon sanottavaa.
yhteenveto
Mutta riippumatta siitä, millaista käyttöä se on, meidän on ymmärrettävä, että Object Pool on erottamaton kolmesta henkilöstä: Pool, Policy ja Provider.
Näiden kolmen kanssa voimme ehkä tehdä mitä haluamme.
Tietenkin se tarjoaa myös useita erityisiä asioita, joita voit tutustua, jos olet kiinnostunut.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|