O Microsoft.Extensions.ObjectPool faz parte da infraestrutura ASP.NET Core, que suporta manter um conjunto de objetos na memória para reutilização, em vez de permitir a coleta de lixo dos objetos. Se os objetos que você deseja gerenciar forem, talvez seja necessário usar pools de objetos:
- A alocação/inicialização é cara.
- Representa algum recurso limitado.
- Use de forma previsível e frequente.
A reutilização é um tema importante e um problema inevitável que frequentemente encontramos em nosso desenvolvimento diário.
Para pegar o exemplo mais simples e familiar, pools de conexões de banco de dados são conexões de banco de dados reutilizadas.
Então, qual é o sentido do reuso?
Simplificando, reduz a perda desnecessária de recursos.
Além das conexões com bancos de dados, pode haver muitos outros objetos que precisam ser reutilizados sob diferentes cenários ou requisitos, e existe um chamado Object Pool.
Você deveria ter implementado funções semelhantes você mesmo, seja com ConcurrentBag, ConcurrentQueue ou com outras soluções.
Isso também compartilha uma implementação na documentação da Microsoft
Como: Criar um Pool de Objetos usando um ConcurrentBag
O login do hiperlink está visível.
Claro, no .NET Core, a Microsoft nos ajudou a implementar um simples Object Pool.
Primeiro, crie um novo projeto de console .NET Core e use o comando nuget para adicionar o seguinte pacote:
Todo o código é o seguinte:
Uso 1
Antes de criar um pool, precisamos definir uma Política. Aqui, usamos diretamente o DefaultPooledObjectPolicy incluído para construí-lo.
O pool de objetos terá um número máximo de threads mantidos.
Use o método Get do objeto do pool para tirar um objeto do pool de objetos.
O código acima executa o resultado
#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00:00 #2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-01/01/0001 00:00 #3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00 #4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-01/01/0001 00:00 #5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-01/01/0001 00:00 #6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-01/00/0001 00:00 #7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-01/01/0001 00:00 #8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-01/01/0001 00:00 #9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-01/1/0001 00:00 #10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-01/01/0001 00:00:00 Esse resultado mostra que os objetos no Object Pool são diretamente renovados, e algumas propriedades não são desvalorizadas, o que muitas vezes não tem muito significado prático atualmente.
Como DefaultPooledObjectPolicy é um objeto novo diretamente, muitas vezes isso não é o que esperamos!
Se você quiser atender ao nosso uso real, precisa definir uma política por conta própria!
Vamos dar uma olhada no uso 2
Uso 2
O método Create é usado para criar o objeto Demo, e o método Return é para lançar o objeto Demo de volta no Object Pool (emprestado e retornado).
O conjunto de objetos é definido aqui para conter apenas um objeto.
Como há uma operação de retorno em uma etapa após retirá-lo do conjunto de objetos, item1 e item2 devem ser o mesmo objeto.
Após retirar o item2 do pool de objetos, ele não é devolvido, então o pool de objetos criará um novo objeto com base na política que definimos.
Aqui está o resultado de saída do uso 2:
15/04/985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com de 2020 3:31:15 15/04/985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com de 2020 3:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-15/04/2020 3:31:15
False Você pode ver que as propriedades individuais do item1, item2 e item3 são as mesmas, e item1 e item2 são de fato o mesmo objeto. Item3 e item 1 não são a mesma coisa.
Uso 3
Você pode ver que item1 e item2 são o mesmo objeto. Ao buscar um objeto do Object Pool, o primeiro será pego, então se você devolvê-lo e recuperá-lo novamente, ainda receberá o original primeiro.
o item3 é retirado diretamente do Object Pool ali e não é criado novamente, porque o Object Pool aqui mantém múltiplos objetos, não apenas um em uso 2, então ele é retirado diretamente do Pool.
Aqui está o resultado de saída
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 Igual ao uso 2, a essência é a mesma.
Uso 4
Parece que o uso acima não é tão parecido com o nosso uso normal. Ainda precisamos depender da injeção.
Então, vamos finalmente ver como combinar a injeção de dependência. Claro, a essência aqui ainda é inseparável das duas coisas de Política e Provedor.
Primeiro precisamos registrar o Provedor e, em seguida, pegar diretamente sua instância para criar um Object Pool.
Se quiser usá-lo em outro lugar, pode injetar pelo construtor.
O resultado aqui também é o mesmo de antes, não há muito o que dizer.
resumo
Mas, independentemente do tipo de uso, precisamos entender que o Object Pool é inseparável dos três caras do Pool, da Política e do Provedor.
Com esses três, talvez possamos fazer o que quisermos.
Claro, ele também oferece várias coisas especiais que você pode conferir se tiver interesse.
PoolObjectTraceingLeaking
StringBuilderPooledObjectPolicy
|