क्या कैश में सभी ऑब्जेक्ट्स के लिए कैश को देखने का कोई तरीका है? मैं गतिशील रूप से वस्तुओं को बना रहा हूं और मुझे उन वस्तुओं को शुद्ध करने के लिए समय-समय पर सूची में जाना होगा जिन्हें मैं अब उपयोग नहीं कर रहा हूं।httpcontext.current.cache में ऑब्जेक्ट की सूची
उत्तर
हाँ, आप या तो कैश कुंजी के आधार पर सूचकांक सकते हैं या आप आप सामग्री पर पुनरावृति कर सकते हैं:
For Each c In Cache
' Do something with c
Next
' Pardon my VB syntax if it's wrong
डाउनवोट क्यों? अगर आप मुझे नहीं बताते कि मैं गलत कहां हूं तो मैं सुधार नहीं कर सकता। –
मैंने डाउनवोट नहीं किया था, लेकिन मुझे यह निर्धारित करने के लिए अन्य उत्तरों देखना होगा कि "सी" चर क्या है और इसका उपयोग कैसे करें। मुझे लगता है कि आपने सवाल के दिल का जवाब दिया, हालांकि कैश में ऑब्जेक्ट्स को कैसे सूचीबद्ध किया जाए। – slolife
जानकारी के लिए धन्यवाद। –
आप वस्तुओं के माध्यम से गणना कर सकते हैं:
System.Web.HttpContext.Current.Cache.GetEnumerator()
यहाँ एक वीबी है कैश के माध्यम से पुनरावृत्त करने के लिए कार्य करें और एक डेटाटेबल प्रतिनिधित्व वापस करें।
Private Function CreateTableFromHash() As DataTable
Dim dtSource As DataTable = New DataTable
dtSource.Columns.Add("Key", System.Type.GetType("System.String"))
dtSource.Columns.Add("Value", System.Type.GetType("System.String"))
Dim htCache As Hashtable = CacheManager.GetHash()
Dim item As DictionaryEntry
If Not IsNothing(htCache) Then
For Each item In htCache
dtSource.Rows.Add(New Object() {item.Key.ToString, item.Value.ToString})
Next
End If
Return dtSource
End Function
के बाद से आप संभावित Cache
वस्तु से आइटम निकालना होना चाहता हूँ, है ना बहुत सुविधाजनक इस पर पुनरावृति करने के लिए (एक IEnumerable
के रूप में), के बाद से इस यात्रा की प्रक्रिया के दौरान हटाने अनुमति नहीं देता है। हालांकि, यह देखते हुए कि आप इंडेक्स द्वारा आइटम तक नहीं पहुंच सकते हैं, यह एकमात्र समाधान है।
हालांकि LINQ का एक बिट समस्या को सरल बना सकता है। निम्नलिखित की तरह कुछ का प्रयास करें:
var cache = HttpContext.Current.Cache;
var itemsToRemove = cache.Where(item => myPredicateHere).ToArray();
foreach (var item in itemsToRemove)
cache.Remove(itemsToRemove.Key);
ध्यान दें कि यात्रा में प्रत्येक item
प्रकार DictionaryEntry
की है।
जेफ़, आपको वास्तव में अपने कैश किए गए आइटमों के लिए निर्भरता देखना चाहिए। ऐसा करने का यह सही तरीका है। अपने समूहों के लिए अपने कैश किए गए डेटा (आइटम) और सेटअप निर्भरताओं को तर्कसंगत रूप से समूहित करें। इस तरह जब आपको पूरे समूह की समयसीमा समाप्त करने की आवश्यकता होती है तो आप इस तरह की आम निर्भरता को छूते हैं और वे सब चले गए हैं।
मुझे यकीन नहीं है कि मैं ऑब्जेक्ट भाग की सूची समझता हूं।
var keysToClear = (from System.Collections.DictionaryEntry dict in HttpContext.Cache
let key = dict.Key.ToString()
where key.StartsWith("Something_")
select key).ToList();
foreach (var key in keysToClear)
{
HttpContext.Cache.Remove(key);
}
यह थोड़ी देर हो चुकी हो सकता है, लेकिन मैं आसानी से सभी कैश से अधिक आइटम पुनरावृति और कैश आइटम कि उनके नाम में एक निश्चित स्ट्रिंग शामिल को हटाने के लिए कुछ कस्टम तर्क प्रदर्शन करने के लिए निम्नलिखित कोड का इस्तेमाल किया।
मैंने वीबी.Net के साथ-साथ सी # में कोड के दोनों संस्करण प्रदान किए हैं।
VB.Net संस्करण
Dim cacheItemsToRemove As New List(Of String)()
Dim key As String = Nothing
'loop through all cache items
For Each c As DictionaryEntry In System.Web.HttpContext.Current.Cache
key = DirectCast(c.Key, String)
If key.Contains("prg") Then
cacheItemsToRemove.Add(key)
End If
Next
'remove the selected cache items
For Each k As var In cacheItemsToRemove
System.Web.HttpContext.Current.Cache.Remove(k)
Next
सी # संस्करण अपने भयानक प्रतिक्रिया के लिए
List<string> cacheItemsToRemove = new List<string>();
string key = null;
//loop through all cache items
foreach (DictionaryEntry c in System.Web.HttpContext.Current.Cache)
{
key = (string)c.Key;
if (key.Contains("prg"))
{
cacheItemsToRemove.Add(key);
}
}
//remove the selected cache items
foreach (var k in cacheItemsToRemove)
{
System.Web.HttpContext.Current.Cache.Remove(k);
}
धन्यवाद सब। कभी सोचा नहीं कि यह कई अच्छे तरीके होंगे। सभी के लिए उपवास! धन्यवाद – Jeff