Microsoft.Extensions.ObjectPool є частиною інфраструктури ASP.NET Core, яка підтримує збереження набору об'єктів у пам'яті для повторного використання замість дозволу сміттєвого збору об'єктів. Якщо об'єкти, якими ви хочете керувати, можливо, доведеться використовувати пули об'єктів:
- Виділення/ініціалізація коштує дорого.
- Це обмежений ресурс.
- Використовуйте передбачувано і часто.
Повторне використання — важлива тема і неминуча проблема, з якою ми часто стикаємося у щоденному розвитку.
Щоб взяти найпростіший і найзнайоміший приклад, пули з'єднання до баз даних — це повторно використані з'єднання з базами даних.
То який сенс повторного використання?
Простіше кажучи, це зменшує непотрібні втрати ресурсів.
Окрім підключень до бази даних, може бути багато інших об'єктів, які потрібно повторно використовувати в різних сценаріях або вимогах, а також існує так званий Object Pool.
Вам слід було реалізувати подібні функції самостійно, або з ConcurrentBag, або ConcurrentQueue, або з іншими рішеннями.
Це також має реалізацію, описану в документації Microsoft
Як зробити: створити пул об'єктів за допомогою ConcurrentBag
Вхід за гіперпосиланням видно.
Звісно, у .NET Core Microsoft допомогла нам реалізувати простий Object Pool.
Спочатку створіть новий проєкт консолі .NET Core і використайте команду nuget, щоб додати наступний пакет:
Весь код виглядає так:
Використання 1
Перед створенням пулу потрібно визначити Політику. Тут ми безпосередньо використовуємо включену DefaultPooledObjectPolicy для його побудови.
Пул об'єктів матиме максимальну кількість потоків, що підтримуються.
Використовуйте метод Get об'єкта пулу, щоб видалити об'єкт із пулу.
Наведений вище код виконує результат
#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 Цей результат показує, що об'єкти в пулі об'єктів є безпосередньо новими, і деякі властивості не знецінюються, що часто не має великого практичного значення на даний момент.
Оскільки DefaultPooledObjectPolicy — це новий об'єкт напряму, часто це не те, чого ми очікуємо!
Якщо ви хочете відповідати нашому фактичному призначенням, вам потрібно самостійно визначити поліс!
Давайте розглянемо використання 2
Використання 2
Метод Create використовується для створення об'єкта Demo, а метод Return — це повернення об'єкта Demo назад у Pool об'єктів (позичений і повернений).
Пул об'єктів тут визначено так, щоб містити лише один об'єкт.
Оскільки після вилучення з пулу об'єктів виконується операція повернення в один крок, item1 і item2 мають бути одним і тим самим об'єктом.
Після видалення item2 з пулу об'єктів він не повертається, тому пул об'єктів створює новий об'єкт на основі визначеної нами політики.
Ось результат використання 2:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 3:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 3:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 3:31:15
False Ви можете побачити, що окремі властивості items1, item2 і item3 збігаються, і item1 та item2 дійсно є одним і тим самим об'єктом. Item3 і Item1 — це не одне й те саме.
Використання 3
Ви можете побачити, що item1 і item2 — це один і той самий об'єкт. Коли ви забираєте об'єкт із пулу об'єктів, перший буде забираний, тож якщо ви повернете його і знову отримаєте, ви все одно отримаєте оригінальний перший.
item3 забирається безпосередньо з Object Pool там і не створюється знову, оскільки Object Pool тут підтримує кілька об'єктів, а не лише один у використанні 2, тому він забирається безпосередньо з пулу.
Ось вихідний результат
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 3:33:58
False Те саме, що й у другому випадку, суть така сама.
Використання 4
Схоже, що наведене вище використання не дуже схоже на наше звичне. Нам все ще потрібно покладатися на ін'єкції.
Отже, нарешті розглянемо, як поєднувати ін'єкції залежності. Звісно, суть тут залишається нерозривною від двох речей: політики та постачальника.
Спочатку потрібно зареєструвати провайдера, а потім безпосередньо взяти його екземпляр для створення пулу об'єктів.
Якщо хочете використати його в іншому місці, можете ввести через конструктор.
Результат тут такий самий, як і раніше, особливо нічого сказати.
зведення
Але незалежно від типу використання, нам потрібно розуміти, що Object Pool нерозривний від трьох учасників — Pool, Policy і Provider.
З цими трьома, можливо, ми зможемо робити все, що захочемо.
Звісно, тут також є кілька особливих речей, які ви можете переглянути, якщо зацікавлені.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|