Microsoft.Extensions.ObjectPool adalah bagian dari infrastruktur ASP.NET Core yang mendukung penyimpanan sekumpulan objek dalam memori untuk digunakan kembali alih-alih mengizinkan pengumpulan objek sampah. Jika objek yang ingin Anda kelola adalah, Anda mungkin perlu menggunakan kumpulan objek:
- Alokasi/inisialisasi mahal.
- Mewakili beberapa sumber daya yang terbatas.
- Gunakan secara prediksi dan sering.
Penggunaan kembali adalah topik penting dan masalah yang tak terelakkan yang sering kita temui dalam perkembangan kita sehari-hari.
Untuk mengambil contoh yang paling sederhana dan paling akrab, kumpulan koneksi database adalah koneksi database yang digunakan kembali.
Jadi apa gunanya menggunakan kembali?
Sederhananya, ini mengurangi kehilangan sumber daya yang tidak perlu.
Selain koneksi database, mungkin ada banyak objek lain yang perlu digunakan kembali dalam skenario atau persyaratan yang berbeda, dan ada yang disebut Kumpulan Objek.
Anda harus mengimplementasikan fungsi serupa sendiri, baik dengan ConcurrentBag, atau ConcurrentQueue, atau dengan solusi lain.
Ini juga membagikan implementasi dalam dokumentasi Microsoft
Cara: Membuat kumpulan objek dengan menggunakan ConcurrentBag
Login hyperlink terlihat.
Tentu saja, di .NET Core, Microsoft telah membantu kami mengimplementasikan Kumpulan Objek sederhana.
Pertama, buat proyek konsol .NET Core baru dan gunakan perintah nuget untuk menambahkan paket berikut:
Semua kodenya adalah sebagai berikut:
penggunaan 1
Sebelum membuat kumpulan, kita perlu menentukan Kebijakan. Di sini kita langsung menggunakan DefaultPooledObjectPolicy yang disertakan untuk membuatnya.
Kumpulan objek akan memiliki jumlah utas maksimum yang dipertahankan.
Gunakan metode Get dari objek kumpulan untuk mengeluarkan objek dari kumpulan objek.
Kode di atas menjalankan hasilnya
#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 12:00:00 #2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 12:00:00 #3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 12:00:00 #4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 12:00:00 #5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 12:00:00 #6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 12:00:00 #7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 12:00:00 #8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 12:00:00 #9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1/1/0001 12:00:00 #10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 12:00:00 Hasil ini menunjukkan bahwa objek dalam Kumpulan Objek diperbarui secara langsung, dan beberapa properti tidak didevaluasi, yang seringkali tidak memiliki banyak makna praktis saat ini.
Karena DefaultPooledObjectPolicy adalah objek baru secara langsung, berkali-kali, ini bukan yang kita harapkan!
Jika Anda ingin memenuhi penggunaan kami yang sebenarnya, Anda harus menentukan kebijakan sendiri!
Mari kita lihat penggunaan 2
penggunaan 2
Metode Create digunakan untuk membuat objek Demo, dan metode Return adalah untuk membuang objek Demo kembali ke Kumpulan Objek (dipinjam dan dikembalikan).
Kumpulan objek didefinisikan di sini untuk menampung hanya satu objek.
Karena ada operasi pengembalian satu langkah setelah mengeluarkannya dari kumpulan objek, item1 dan item2 harus menjadi objek yang sama.
Setelah mengeluarkan item2 dari kumpulan objek, itu tidak dikembalikan, sehingga kumpulan objek akan membuat objek baru berdasarkan kebijakan yang kami tentukan.
Berikut adalah hasil keluaran dari penggunaan 2:
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-4/15/2020 03:31:15 985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-4/15/2020 03:31:15
True 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com-4/15/2020 3:31:15 AM
False Anda dapat melihat bahwa properti individu item1, item2 dan item3 adalah sama, dan item1 dan item2 memang objek yang sama. Item3 dan item1 bukanlah hal yang sama.
Penggunaan 3
Anda dapat melihat bahwa item1 dan item2 adalah objek yang sama. Saat mengambil objek dari Kumpulan Objek, yang pertama akan diambil, jadi jika Anda mengembalikannya dan mengambilnya lagi, Anda akan tetap mendapatkan yang asli terlebih dahulu.
item3 diambil langsung dari Object Pool di sana dan tidak dibuat lagi, karena Object Pool di sini mempertahankan beberapa objek, bukan hanya satu dalam penggunaan 2, sehingga diambil langsung dari Pool.
Berikut adalah hasil keluarannya
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-4/15/2020 03:33:58 f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-4/15/2020 03:33:58
True b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-4/15/2020 03:33:58
False Sama seperti penggunaan 2, esensinya sama.
penggunaan 4
Tampaknya penggunaan di atas tidak begitu mirip dengan penggunaan normal kita. Kita masih perlu mengandalkan suntikan.
Jadi akhirnya mari kita lihat cara menggabungkan injeksi ketergantungan. Tentu saja, esensi di sini masih tidak terlepas dari dua hal Kebijakan dan Penyedia.
Pertama-tama kita perlu mendaftarkan Provider, dan kemudian langsung mengambil instancenya untuk membuat Object Pool.
Jika Anda ingin menggunakannya di tempat lain, Anda dapat menyuntikkannya melalui konstruktor.
Hasilnya di sini juga sama seperti sebelumnya, tidak banyak yang bisa dikatakan.
ringkasan
Tetapi apa pun jenis penggunaannya, kita perlu memahami bahwa Object Pool tidak dapat dipisahkan dari tiga orang Pool, Policy dan Provider.
Dengan ketiganya, mungkin kita bisa melakukan apa pun yang kita inginkan.
Tentu saja, ia juga menawarkan beberapa hal khusus yang dapat Anda lihat jika Anda tertarik.
LeakTrackingObjectPool
StringBuilderPooledObjectPolicy
|