Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 30226|Răspunde: 1

[.NET Core] Explicație detaliată a Object Pool în .NET Core

[Copiază linkul]
Postat la 2020-4-15 17:38:34 | | | |
Microsoft.Extensions.ObjectPool face parte din infrastructura ASP.NET Core, care susține păstrarea unui set de obiecte în memorie pentru reutilizare, în loc să permită colectarea gunoiului a obiectelor.
Dacă obiectele pe care vrei să le gestionezi sunt, s-ar putea să fie nevoie să folosești pool-uri de obiecte:

  • Alocarea/inițializarea este costisitoare.
  • Reprezintă o resursă limitată.
  • Folosește-le previzibil și frecvent.


Reutilizarea este un subiect important și o problemă inevitabilă cu care ne confruntăm adesea în dezvoltarea noastră zilnică.

Pentru a lua cel mai simplu și familiar exemplu, pool-urile de conexiuni la baze de date sunt conexiuni de bază de date reutilizate.

Deci, care este rostul reutilizării?

Pe scurt, reduce pierderile inutile de resurse.

Pe lângă conexiunile la baze de date, pot exista multe alte obiecte care trebuie reutilizate în diferite scenarii sau cerințe, iar există așa-numitul Object Pool.

Ar fi trebuit să fi implementat funcții similare tu însuți, fie cu ConcurrentBag, fie cu ConcurrentQueue, fie cu alte soluții.

Aceasta împarte, de asemenea, o implementare în documentația Microsoft

Cum să: Creezi un pool de obiecte folosind un ConcurrentBag

Autentificarea cu hyperlink este vizibilă.

Desigur, în .NET Core, Microsoft ne-a ajutat să implementăm un simplu Object Pool.

Mai întâi, creează un nou proiect de consolă .NET Core și folosește comanda nuget pentru a adăuga următorul pachet:

Tot codul este următorul:

Utilizare 1



Înainte de a crea un pool, trebuie să definim o Politică. Aici folosim direct DefaultPooledObjectPolicy inclus pentru a o construi.

Pool-ul de obiecte va menține un număr maxim de fire de execuție.

Folosește metoda Get a obiectului pool-ului pentru a scoate un obiect din pool-ul de obiecte.

Codul de mai sus rulează rezultatul

#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00 AM
#2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 00:00 AM
#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 AM
#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 AM
#7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 00:00:00 AM
#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 AM
#10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 00:00:00 AM
Acest rezultat arată că obiectele din Object Pool sunt direct noi, iar unele proprietăți nu sunt devalorizate, ceea ce adesea nu are prea multă semnificație practică în acest moment.

Pentru că DefaultPooledObjectPolicy este un obiect nou direct, de multe ori, acest lucru nu este ceea ce ne așteptăm!

Dacă vrei să îndeplinești utilizarea noastră reală, trebuie să definești tu o poliță!

Să aruncăm o privire la utilizarea 2

Utilizare 2

Metoda Create este folosită pentru a crea obiectul Demo, iar metoda Return este pentru a arunca obiectul Demo înapoi în Object Pool (împrumutat și returnat).



Pool-ul de obiecte este definit aici pentru a conține un singur obiect.

Deoarece există o operație de returnare într-un singur pas după ce îl scoți din pool-ul de obiecte, itemul1 și elementul 2 ar trebui să fie același obiect.

După ce elementul 2 este eliminat din pool-ul de obiecte, acesta nu este returnat, astfel că pool-ul de obiecte va crea un obiect nou pe baza politicii definite.

Iată rezultatul de ieșire al utilizării 2:

985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-4/15/2020 3:31:15 AM
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-4/15/2020 3:31:15 AM
True
8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 3:31:15 AM
False
Poți vedea că proprietățile individuale ale elementelor 1, item2 și item3 sunt aceleași, iar item1 și item2 sunt într-adevăr același obiect. Itemul 3 și punctul 1 nu sunt același lucru.


Utilizare 3

Poți vedea că item1 și item2 sunt același obiect. Când recuperezi un obiect din Object Pool, primul va fi luat, așa că dacă îl returnezi și îl recuperezi din nou, vei primi totuși originalul primul.



itemul 3 este preluat direct din Object Pool-ul de acolo și nu este creat din nou, deoarece Object Pool-ul de aici menține mai multe obiecte, nu doar unul în utilizare 2, deci este preluat direct din Pool.

Iată rezultatul de ieșire

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
La fel ca la utilizare 2, esența este aceeași.

Utilizare 4

Se pare că utilizarea de mai sus nu este atât de asemănătoare cu utilizarea noastră obișnuită. Trebuie să ne bazăm în continuare pe injecție.

Așadar, să vedem în sfârșit cum să combinăm injecția de dependență. Desigur, esența aici rămâne inseparabilă de cele două aspecte ale Poliței și Furnizorului.



Mai întâi trebuie să înregistrăm Furnizorul, apoi să luăm direct instanța sa pentru a crea un Object Pool.

Dacă vrei să-l folosești în altă parte, îl poți injecta prin constructor.

Rezultatul de aici este același ca înainte, nu prea am ce spune.

rezumat

Dar, indiferent de tipul de utilizare, trebuie să înțelegem că Object Pool este inseparabil de cei trei oameni: Pool, Policy și Provider.

Cu acești trei, poate putem face orice vrem.

Desigur, oferă și câteva lucruri speciale pe care le poți verifica dacă ești interesat.

LeakTrackingObjectPool

StringBuilderPooledObjectPolicy





Precedent:Introducere în îmbunătățirile serviciilor web (WSE) 3.0
Următor:Cum găsește Visual Studio 2013 conținut care înlocuiește mai multe linii?
 Proprietarul| Postat la 30-08-2023 18:34:07 |
DefaultObjectPool este folosit la nivelul de bazăConcurrentQueueImplementarea cozii de securitate a firelor de execuție, codul sursă este următorul:


Autentificarea cu hyperlink este vizibilă.


Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com