2009-07-06 11 views
5

क्या कैश में सभी ऑब्जेक्ट्स के लिए कैश को देखने का कोई तरीका है? मैं गतिशील रूप से वस्तुओं को बना रहा हूं और मुझे उन वस्तुओं को शुद्ध करने के लिए समय-समय पर सूची में जाना होगा जिन्हें मैं अब उपयोग नहीं कर रहा हूं।httpcontext.current.cache में ऑब्जेक्ट की सूची

+0

धन्यवाद सब। कभी सोचा नहीं कि यह कई अच्छे तरीके होंगे। सभी के लिए उपवास! धन्यवाद – Jeff

उत्तर

5

हाँ, आप या तो कैश कुंजी के आधार पर सूचकांक सकते हैं या आप आप सामग्री पर पुनरावृति कर सकते हैं:

For Each c In Cache 
    ' Do something with c 
Next 
' Pardon my VB syntax if it's wrong 
+0

डाउनवोट क्यों? अगर आप मुझे नहीं बताते कि मैं गलत कहां हूं तो मैं सुधार नहीं कर सकता। –

+0

मैंने डाउनवोट नहीं किया था, लेकिन मुझे यह निर्धारित करने के लिए अन्य उत्तरों देखना होगा कि "सी" चर क्या है और इसका उपयोग कैसे करें। मुझे लगता है कि आपने सवाल के दिल का जवाब दिया, हालांकि कैश में ऑब्जेक्ट्स को कैसे सूचीबद्ध किया जाए। – slolife

+0

जानकारी के लिए धन्यवाद। –

6

आप वस्तुओं के माध्यम से गणना कर सकते हैं:

System.Web.HttpContext.Current.Cache.GetEnumerator() 
3

यहाँ एक वीबी है कैश के माध्यम से पुनरावृत्त करने के लिए कार्य करें और एक डेटाटेबल प्रतिनिधित्व वापस करें।

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 
1

के बाद से आप संभावित 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 की है।

1

जेफ़, आपको वास्तव में अपने कैश किए गए आइटमों के लिए निर्भरता देखना चाहिए। ऐसा करने का यह सही तरीका है। अपने समूहों के लिए अपने कैश किए गए डेटा (आइटम) और सेटअप निर्भरताओं को तर्कसंगत रूप से समूहित करें। इस तरह जब आपको पूरे समूह की समयसीमा समाप्त करने की आवश्यकता होती है तो आप इस तरह की आम निर्भरता को छूते हैं और वे सब चले गए हैं।

मुझे यकीन नहीं है कि मैं ऑब्जेक्ट भाग की सूची समझता हूं।

15
 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); 
     } 
2

यह थोड़ी देर हो चुकी हो सकता है, लेकिन मैं आसानी से सभी कैश से अधिक आइटम पुनरावृति और कैश आइटम कि उनके नाम में एक निश्चित स्ट्रिंग शामिल को हटाने के लिए कुछ कस्टम तर्क प्रदर्शन करने के लिए निम्नलिखित कोड का इस्तेमाल किया।

मैंने वीबी.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); 
    }