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 #2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 00:00 #3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00 00:00 #4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 00:00 #5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 00:00 #6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 00:00 #7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 00:00 #8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 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 Этот результат показывает, что объекты в Object Pool являются напрямую новыми, и некоторые свойства не обесцениваются, что часто не имеет большого практического значения в данный момент.
Поскольку DefaultPooledObjectPolicy — это новый объект напрямую, часто это не то, чего мы ожидаем!
Если вы хотите соответствовать нашему реальному использованию, вам нужно самостоятельно определить полис!
Давайте рассмотрим второе применение
Применение 2
Метод Create используется для создания объекта Demo, а метод Return — чтобы вернуть объект Demo обратно в Object Pool (заимствован и возвращённый).
Пул объектов здесь определен так, чтобы содержать только один объект.
Поскольку после извлечения из пула объектов выполняется одношаговая операция возврата, item1 и item2 должны быть одним и тем же объектом.
После удаления item2 из пула объектов он не возвращается, поэтому пул объектов создаст новый объект на основе определённой нами политики.
Вот результат использования 2:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 03:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-15.04.2020 03:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15.04.2020 3:31:15
False Вы видите, что отдельные свойства items1, item2 и item3 совпадают, а item 1 и item 2 действительно являются одним и тем же объектом. Предмет 3 и предмет 1 — это не одно и то же.
Применение 3
Вы видите, что item1 и item2 — это один и тот же объект. При заборе объекта из пула объектов будет захвачен первый, так что если вы вернёте его и заберёте снова, вы всё равно получите оригинал первым.
item3 берётся напрямую из пула объектов и не создаётся снова, потому что пул объектов здесь поддерживает несколько объектов, а не только один в использовании 2, поэтому он берётся напрямую из пула.
Вот результат вывода
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15.04.2020 03:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15.04.2020 03:33:58
False То же самое, что и во втором случае, суть остаётся той же.
Применение 4
Похоже, что вышеописанное применение не так уж похоже на наше обычное применение. Нам всё ещё нужно полагаться на инъекции.
Итак, давайте наконец посмотрим, как комбинировать инъекции зависимости. Конечно, суть здесь по-прежнему неотделима от двух вещей — политики и поставщика.
Сначала нужно зарегистрировать провайдера, а затем напрямую взять его экземпляр для создания пула объектов.
Если хотите использовать его в другом месте, можно ввести через конструктор.
Результат здесь тоже такой же, как и раньше, особо нечего сказать.
сводка
Но независимо от типа использования, нужно понимать, что Object Pool неотделима от трёх участников — Pool, Policy и Provider.
С этими тремя, может быть, мы сможем делать всё, что захотим.
Конечно, там также есть несколько особенных вещей, которые вы можете ознакомиться, если вам интересно.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|