Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 30226|Yanıt: 1

[.NET Core] .NET Core'da Nesne Havuzu hakkında ayrıntılı açıklama

[Bağlantıyı kopyala]
2020-4-15 tarihinde 17:38:34 tarihinde yayınlandı | | | |
Microsoft.Extensions.ObjectPool, nesne toplama yerine yeniden kullanılmak üzere bir dizi nesne bellekte tutmayı destekleyen ASP.NET Core altyapısının bir parçasıdır.
Yönetmek istediğiniz nesneler ise, nesne havuzlarını kullanmanız gerekebilir:

  • Tahsis/başlatma maliyetlidir.
  • Sınırlı bir kaynağı temsil ediyor.
  • Tahmin edilebilir ve sık kullanın.


Yeniden kullanım, günlük gelişimimizde sıkça karşılaştığımız önemli bir konu ve kaçınılmaz bir sorundur.

En basit ve en tanıdık örneği ele almak gerekirse, veritabanı bağlantı havuzları yeniden kullanılan veritabanı bağlantılarıdır.

Peki yeniden kullanmanın amacı nedir?

Basitçe söylemek gerekirse, gereksiz kaynak kaybını azaltır.

Veritabanı bağlantılarına ek olarak, farklı senaryolar veya gereksinimler altında yeniden kullanılması gereken birçok başka nesne olabilir ve sözde bir Nesne Havuzu vardır.

Benzer işlevleri kendiniz de uygulamalıydınız, ya ConcurrentBag, ya ConcurrentQueue veya diğer çözümlerle.

Bu aynı zamanda Microsoft dokümantasyonunda da bir uygulamayı paylaşıyor

Nasıl yapılır: ConcurrentBag kullanarak bir nesne havuzu oluşturulur

Bağlantı girişi görünür.

Tabii ki, .NET Core'da Microsoft, basit bir Nesne Havuzu uygulamamıza yardımcı oldu.

İlk olarak, yeni bir .NET Core konsol projesi oluşturun ve nuget komutunu kullanarak aşağıdaki paketi ekleyin:

Tüm kodlar aşağıdaki gibidir:

Kullanım 1



Bir havuz oluşturmadan önce bir Politika tanımlamamız gerekiyor. Burada doğrudan dahil edilen DefaultPooledObjectPolicy ile oluşturulur.

Nesne havuzunda maksimum sayıda iş parçacığı tutulur.

Havuz nesnesinin Get yöntemini kullanarak nesne havuzundan bir nesne çıkarabilirsiniz.

Yukarıdaki kod sonucu çalıştırıyor

#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
Bu sonuç, Nesne Havuzu'ndaki nesnelerin doğrudan yenilendiğini ve bazı özelliklerin değersizleştirilmediğini gösterir; bu da şu anda pratik anlamı pek az olur.

DefaultPooledObjectPolicy doğrudan yeni bir nesne olduğu için, çoğu zaman beklediğimiz şey bu değil!

Gerçek kullanımımızı karşılamak istiyorsanız, kendiniz bir poliçe tanımlamanız gerekir!

Kullanım 2'ye bir bakalım

Kullanım 2

Create yöntemi Demo nesnesini oluşturmak için kullanılır ve Return yöntemi ise Demo nesnesini Nesne Havuzuna (ödünç alınıp geri gönderilen) geri atmaktır.



Nesne havuzu burada yalnızca bir nesneyi barındıracak şekilde tanımlanmıştır.

Nesne havuzundan çıkarıldıktan sonra tek adımlı bir geri dönüş işlemi olduğundan, öğe 1 ve öğe 2 aynı nesne olmalıdır.

Öğe 2 nesne havuzundan çıkarıldıktan sonra geri dönmez, bu yüzden nesne havuzu, tanımladığımız politikaya göre yeni bir nesne oluşturur.

İşte 2. kullanımın çıktı sonucu şöyle:

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 03:31:15
False
Öğe 1, madde 2 ve madde 3'ün bireysel özelliklerinin aynı olduğunu ve madde 1 ile madde 2'nin gerçekten aynı nesne olduğunu görebilirsiniz. Madde 3 ve madde 1 aynı şey değildir.


Kullanım 3

Eşya 1 ve madde 2'nin aynı nesne olduğunu görebilirsiniz. Nesne Havuzu'ndan bir nesne alındığında, ilk nesne alınır, yani geri getirip tekrar alırsanız önce orijinal nesneyi alırsınız.



item3 doğrudan oradaki Nesne Havuzundan alınır ve tekrar oluşturulmaz, çünkü buradaki Nesne Havuzu birden fazla nesne tutar, sadece bir değil, 2. kullanımda doğrudan Havuzdan alınır.

İşte çıktı sonucu

f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15/4/2020 03:33:58
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-15/4/2020 03:33:58
True
b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-15/04/2020 03:33:58
False
Kullanım 2'de olduğu gibi, özü aynı.

Kullanım 4

Yukarıdaki kullanım şekli normal kullanımımıza çok benzemiyor gibi görünüyor. Hâlâ enjeksiyona güvenmemiz gerekiyor.

O halde bağımlılık enjeksiyonunu nasıl birleştireceğimize son olarak bakalım. Elbette, buradaki öz, Politika ve Sağlayıcı olmak gibi iki şeyden ayrılmaz bir noktadır.



Önce Sağlayıcıyı kaydetmemiz gerekiyor, ardından doğrudan onun örneğini alıp bir Nesne Havuzu oluşturmamız gerekiyor.

Başka bir yerde kullanmak isterseniz, yapıcının üzerinden enjekte edebilirsiniz.

Buradaki sonuç da öncekiyle aynı, söylenecek pek bir şey yok.

özet

Ama kullanım türü ne olursa olsun, Object Pool'un Pool, Policy ve Provider'dan ayrılmaz olduğunu anlamamız gerekiyor.

Bu üçüyle belki istediğimizi yapabiliriz.

Elbette, ilgileniyorsanız göz atabileceğiniz birkaç özel şey de sunuyor.

LeakTrackingObjectPool

StringBuilderPooledObjectPolicy





Önceki:Web Hizmetleri Geliştirmelerine Giriş (WSE) 3.0
Önümüzdeki:Visual Studio 2013, birden fazla satırın yerine geçen içeriği nasıl buluyor?
 Ev sahibi| 2023-8-30 18:34:07 tarihinde yayınlandı |
DefaultObjectPool altta yatan seviyede kullanılırConcurrentQueueİş parçacığı güvenlik kuyruğu uygulamasında, kaynak kodu şu şekildedir:


Bağlantı girişi görünür.


Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com