Saya telah membuat cache menggunakan kelas MemoryCache. Saya menambahkan beberapa item ke dalamnya tetapi ketika saya perlu memuat ulang cache saya ingin menghapusnya terlebih dahulu. Apa cara tercepat untuk melakukan ini? Haruskah saya mengulang semua item dan menghapusnya satu per satu atau adakah cara yang lebih baik?
100
Jawaban:
Dispose
MemoryCache yang ada dan buat objek MemoryCache baru.sumber
Dispose
memang memanggilCacheEntryRemovedCallback
item yang dilampirkan ke cache saat ini.Masalah dengan pencacahan
Bagian MemoryCache.GetEnumerator () Keterangan memperingatkan: "Mengambil enumerator untuk instance MemoryCache adalah operasi pemblokiran dan sumber daya intensif. Oleh karena itu, enumerator tidak boleh digunakan dalam aplikasi produksi."
Inilah alasannya , dijelaskan dalam pseudocode implementasi GetEnumerator ():
Karena implementasi membagi cache di beberapa objek Dictionary, itu harus menyatukan semuanya menjadi satu koleksi untuk mengembalikan enumerator. Setiap panggilan ke GetEnumerator menjalankan proses penyalinan lengkap yang dijelaskan di atas. Dictionary yang baru dibuat berisi referensi ke kunci internal asli dan objek nilai, sehingga nilai data cache Anda yang sebenarnya tidak diduplikasi.
Peringatan di dokumentasi benar. Hindari GetEnumerator () - termasuk semua jawaban di atas yang menggunakan kueri LINQ.
Solusi yang lebih baik dan lebih fleksibel
Berikut adalah cara efisien untuk membersihkan cache yang hanya dibangun di atas infrastruktur pemantauan perubahan yang ada. Ini juga memberikan fleksibilitas untuk menghapus seluruh cache atau hanya subset bernama dan tidak memiliki masalah yang dibahas di atas.
sumber
Dari http://connect.microsoft.com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
Solusinya adalah:
sumber
Select()
?sumber
Jika kinerja tidak menjadi masalah maka satu baris yang bagus ini akan melakukan trik:
sumber
Sepertinya ada Trim metode .
Jadi untuk menghapus semua konten yang baru saja Anda lakukan
EDIT: setelah menggali lagi, tampaknya melihat Trim tidak sepadan dengan waktu Anda
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
Bagaimana cara menghapus System.Runtime.Caching.MemoryCache
sumber
Anda juga bisa melakukan sesuatu seperti ini:
sumber
Berlari melintasi ini, dan berdasarkan itu, menulis metode paralel yang sedikit lebih efektif dan jelas:
sumber
Saya hanya tertarik untuk membersihkan cache dan menemukan ini sebagai opsi, saat menggunakan c # GlobalCachingProvider
sumber
versi jawaban magritte yang sedikit lebih baik.
sumber
Anda dapat membuang cache MemoryCache.Default dan kemudian menyetel ulang kolom privat tunggal menjadi nol, untuk membuatnya membuat ulang MemoryCache.Default.
sumber