Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 30226|Odpowiedź: 1

[.NET Core] Szczegółowe wyjaśnienie puli obiektów w .NET Core

[Skopiuj link]
Opublikowano 2020-4-15 o 17:38:34 | | | |
Microsoft.Extensions.ObjectPool jest częścią infrastruktury ASP.NET Core, która wspiera przechowywanie zestawu obiektów w pamięci do ponownego użycia zamiast pozwalać na zbieranie śmieci obiektów.
Jeśli obiekty, którymi chcesz zarządzać, są takie, może być konieczne użycie pul obiektów:

  • Alokacja/inicjalizacja jest kosztowna.
  • Reprezentuje pewne ograniczone zasoby.
  • Używaj przewidywalnie i często.


Ponowne wykorzystanie to ważny temat i nieunikniony problem, z którym często napotykamy się na co dzień.

Aby podać najprostszy i najbardziej znany przykład, pule połączeń baz danych to połączenia z bazą danych wielokrotnie używanych.

Jaki jest więc sens ponownego użycia?

Mówiąc wprost, ogranicza to niepotrzebne straty zasobów.

Oprócz połączeń z bazą danych, może istnieć wiele innych obiektów, które wymagają ponownego wykorzystania w różnych scenariuszach lub wymaganiach, a istnieje tzw. Pula Obiektów.

Powinieneś sam zaimplementować podobne funkcje, albo za pomocą ConcurrentBag, ConcurrentQueue, albo innych rozwiązań.

To również dzieli implementację w dokumentacji Microsoftu

Jak: Utworzyć pulę obiektów za pomocą ConcurrentBag

Logowanie do linku jest widoczne.

Oczywiście, w .NET Core Microsoft pomógł nam wdrożyć prostą pulę obiektów.

Najpierw stwórz nowy projekt konsoli .NET Core i użyj polecenia nuget, aby dodać następujący pakiet:

Cały kod wygląda następująco:

Zastosowanie 1



Przed utworzeniem puli musimy zdefiniować Politykę. Tutaj bezpośrednio używamy dołączonego DefaultPooledObjectPolicy do jego konstrukcji.

Pula obiektów będzie miała maksymalną liczbę wątków utrzymywaną.

Użyj metody Get obiektu puli, aby usunąć obiekt z puli obiektów.

Powyższy kod wykonuje wynik

#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
#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
#10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 00:00
Wynik ten pokazuje, że obiekty w Object Pool są bezpośrednio nowe, a niektóre właściwości nie są dewaluowane, co często nie ma obecnie większego praktycznego znaczenia.

Ponieważ DefaultPooledObjectPolicy jest nowym obiektem, często nie jest to to, czego się spodziewamy!

Jeśli chcesz spełnić nasze rzeczywiste użytkowanie, musisz samodzielnie zdefiniować politykę!

Przyjrzyjmy się zastosowaniu 2

Zastosowanie 2

Metoda Create służy do utworzenia obiektu Demo, a metoda Return polega na wrzucaniu obiektu Demo z powrotem do puli obiektów (wypożyczony i zwrócony).



Pula obiektów jest tutaj zdefiniowana tak, aby mieścić tylko jeden obiekt.

Ponieważ po wyjęciu z puli obiektów następuje jednokrokowa operacja zwrotu, pozycja 1 i pozycja2 powinny być tym samym obiektem.

Po wyjęciu elementu 2 z puli obiektów nie jest on zwracany, więc pula obiektów tworzy nowy obiekt na podstawie zdefiniowanej przez nas polityki.

Oto wynik końcowy z użycia 2:

985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 00:31:15
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 00:31:15
True
8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 3:31:15
False
Widać, że indywidualne właściwości elementu1, elementu2 i przedmiotu 3 są takie same, a przedmiot 1 i przedmiot2 to rzeczywiście ten sam obiekt. Pozycja 3 i przedmiot 1 to nie to samo.


Zastosowanie 3

Widać, że przedmiot1 i przedmiot2 to ten sam obiekt. Podczas pobierania obiektu z Object Pool, pierwszy zostanie pobrany, więc jeśli go zwrócisz i ponownie pobierzesz, i tak najpierw otrzymasz oryginał.



item3 jest pobierany bezpośrednio z Object Pool i nie jest ponownie tworzony, ponieważ Object Pool tutaj utrzymuje wiele obiektów, a nie tylko jeden w Użyciu 2, więc jest pobierany bezpośrednio z Pool.

Oto wynik wyjściowy

f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 3:33:58
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 3:33:58
True
b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15.04.2020 03:33:58
False
Tak samo jak w użyciu 2, esencja pozostaje taka sama.

Zastosowanie 4

Wydaje się, że powyższe użycie nie jest tak podobne do naszego normalnego użycia. Wciąż musimy polegać na zastrzykach.

Na koniec przyjrzyjmy się, jak połączyć zastrzyk zależności. Oczywiście, istota tego rozwiązania jest nadal nierozerwalnie związana z dwoma kwestiami: Polisą i Dostawcą.



Najpierw musimy zarejestrować dostawcę, a następnie bezpośrednio wziąć jego instancję, aby utworzyć pulę obiektów.

Jeśli chcesz użyć go gdzie indziej, możesz wstrzyknąć go przez konstruktor.

Efekt tutaj również jest taki sam jak wcześniej, nie ma zbyt wiele do powiedzenia.

streszczenie

Ale bez względu na to, jakiego rodzaju używania, musimy zrozumieć, że Object Pool jest nierozerwalnie związany z trzema osobami: pulą, polityką i dostawcą.

Z tą trójką może możemy robić, co chcemy.

Oczywiście oferuje też kilka wyjątkowych rzeczy, które możesz sprawdzić, jeśli jesteś zainteresowany.

LeakTrackingObjectPool

StringBuilderPooledObjectPolicy





Poprzedni:Wprowadzenie do ulepszeń usług internetowych (WSE) 3.0
Następny:Jak Visual Studio 2013 znajduje treści, które zastępują wiele linijek?
 Ziemianin| Opublikowano 30.08.2023, 18:34:07 |
DefaultObjectPool jest używany na poziomie podstawowymConcurrentQueueImplementacja kolejki bezpieczeństwa wątków, kod źródłowy wygląda następująco:


Logowanie do linku jest widoczne.


Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com