Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 30226|Antwort: 1

[.NET Core] Detaillierte Erklärung des Objektpools in .NET Core

[Link kopieren]
Veröffentlicht am 15.04.2020, 17:38:34 | | | |
Microsoft.Extensions.ObjectPool ist Teil der ASP.NET Core-Infrastruktur, die das Speichern einer Menge von Objekten im Speicher zur Wiederverwendung unterstützt, anstatt eine Garbage Collection von Objekten zuzulassen.
Wenn die Objekte, die du verwalten möchtest, sind, musst du eventuell Objektpools verwenden:

  • Zuweisung/Initialisierung ist teuer.
  • Stellt eine begrenzte Ressource dar.
  • Verwenden Sie vorhersehbar und häufig.


Wiederverwendung ist ein wichtiges Thema und ein unvermeidliches Problem, dem wir im Alltag oft begegnen.

Um das einfachste und bekannteste Beispiel zu nehmen: Datenbank-Verbindungspools sind wiederverwendete Datenbankverbindungen.

Was ist also der Sinn der Wiederverwendung?

Kurz gesagt, es reduziert unnötigen Ressourcenverlust.

Neben Datenbankverbindungen kann es viele andere Objekte geben, die unter unterschiedlichen Szenarien oder Anforderungen wiederverwendet werden müssen, und es gibt einen sogenannten Objektpool.

Ähnliche Funktionen hättest du selbst implementieren sollen, entweder mit ConcurrentBag, ConcurrentQueue oder anderen Lösungen.

Diese teilt sich auch eine Implementierung in der Microsoft-Dokumentation

Anleitung: Erstellen Sie einen Objektpool mit einem ConcurrentBag

Der Hyperlink-Login ist sichtbar.

Natürlich hat Microsoft uns in .NET Core geholfen, einen einfachen Object Pool zu implementieren.

Erstellen Sie zunächst ein neues .NET Core Konsolenprojekt und verwenden Sie den nuget-Befehl, um das folgende Paket hinzuzufügen:

Der gesamte Code lautet wie folgt:

Verwendung 1



Bevor wir einen Pool erstellen, müssen wir eine Richtlinie definieren. Hier verwenden wir direkt das enthaltene DefaultPooledObjectPolicy, um es zu erstellen.

Der Objektpool hat eine maximale Anzahl von verwalteten Threads.

Verwenden Sie die Get-Methode des Pool-Objekts, um ein Objekt aus dem Objektpool zu entfernen.

Der obige Code führt das Ergebnis aus

#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1.1.0001 00:00:00 Uhr
#2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1.1.0001 00:00:00 Uhr
#3-de717815-796a-4349-a571-047acc125104-itsvse.com-1.1.0001 00:00:00 Uhr
#4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1.1.0001 00:00:00 Uhr
#5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1.1.0001 00:00:00 Uhr
#6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1.1.0001 00:00:00 Uhr
#7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1.1.0001 00:00:00 Uhr
#8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1.1.0001 00:00:00 Uhr
#9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1.1.0001 00:00:00 Uhr
#10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1.1.0001 00:00:00 Uhr
Dieses Ergebnis zeigt, dass die Objekte im Objektpool direkt neu sind und einige Eigenschaften nicht entwertet sind, was derzeit oft wenig praktische Bedeutung hat.

Da DefaultPooledObjectPolicy direkt ein neues Objekt ist, ist das oft nicht das, was wir erwarten!

Wenn Sie unsere tatsächliche Nutzung erfüllen wollen, müssen Sie selbst eine Police festlegen!

Schauen wir uns Anwendung 2 an

Verwendung 2

Die Create-Methode wird verwendet, um das Demo-Objekt zu erstellen, und die Return-Methode besteht darin, das Demo-Objekt zurück in den Object Pool zu werfen (ausgeliehen und zurückgegeben).



Der Objektpool ist hier so definiert, dass er nur ein Objekt enthält.

Da nach dem Entfernen aus dem Objektpool eine Ein-Schritt-Rückgabeoperation erfolgt, sollten Item1 und Item2 dasselbe Objekt sein.

Nachdem Item2 aus dem Objektpool entfernt wurde, wird er nicht zurückgegeben, sodass der Objektpool basierend auf der von uns definierten Richtlinie ein neues Objekt erstellt.

Hier ist das Ausgabeergebnis der Nutzung 2:

985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 03:31:15 Uhr
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 03:31:15 Uhr
True
8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 03:31:15 Uhr
False
Du siehst, dass die einzelnen Eigenschaften von Item1, Item2 und Item3 gleich sind, und Item1 und Item2 tatsächlich dasselbe Objekt sind. Item3 und Item1 sind nicht dasselbe.


Verwendung 3

Man sieht, dass Item1 und Item2 dasselbe Objekt sind. Beim Abrufen eines Objekts aus dem Objektpool wird das erste Objekt genommen, sodass du, wenn du es zurückgibst und erneut abholst, trotzdem zuerst das Original bekommst.



item3 wird direkt aus dem Object Pool dort genommen und nicht erneut erstellt, da der Object Pool hier mehrere Objekte verwaltet, nicht nur eines in Use 2, sodass es direkt aus dem Pool entnommen wird.

Hier ist das Ausgabeergebnis

f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58 Uhr
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58 Uhr
True
b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15.04.2020 03:33:58 Uhr
False
Wie bei Verwendung 2 ist die Essenz gleich.

Verwendung 4

Es scheint, dass die oben genannte Nutzung unserer normalen Nutzung nicht so ähnlich ist. Wir müssen uns weiterhin auf die Injektion verlassen.

Schauen wir uns also endlich an, wie man die Abhängigkeitsinjektion kombiniert. Natürlich ist das Wesentliche hier immer noch untrennbar mit den beiden Dingen Police und Anbieter verbunden.



Wir müssen zuerst den Anbieter registrieren und dann direkt seine Instanz nutzen, um einen Objektpool zu erstellen.

Wenn du es woanders verwenden möchtest, kannst du es über den Konstruktor injizieren.

Das Ergebnis ist hier ebenfalls dasselbe wie zuvor, es gibt nicht viel zu sagen.

Zusammenfassung

Aber egal, um welche Art von Nutzung es sich handelt, wir müssen verstehen, dass Object Pool untrennbar mit den drei Mitgliedern von Pool, Policy und Provider verbunden ist.

Mit diesen dreien können wir vielleicht machen, was wir wollen.

Natürlich gibt es auch einige besondere Dinge, die Sie ausprobieren können, wenn Sie interessiert sind.

LeakTrackingObjectPool

StringBuilderPooledObjectPolicy





Vorhergehend:Einführung in Web Services Enhancements (WSE) 3.0
Nächster:Wie findet Visual Studio 2013 Inhalte, die mehrere Zeilen ersetzen?
 Vermieter| Veröffentlicht am 30.8.2023, 18:34:07 |
DefaultObjectPool wird auf der zugrundeliegenden Ebene verwendetConcurrentQueueBei der Implementierung der Thread-Sicherheitswarteschlangen ist der Quellcode wie folgt:


Der Hyperlink-Login ist sichtbar.


Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com