سؤال

هل هناك طريقة للنظر في ذاكرة التخزين المؤقت لجميع الكائنات في ذاكرة التخزين المؤقت؟ أنا أخلق كائنات ديناميكيا وأحتاج إلى الذهاب بشكل دوري من خلال القائمة لتنقية الكائنات التي لم أعد أستخدمها.

هل كانت مفيدة؟

المحلول

نعم، يمكنك إما فهرس يستند إلى مفتاح ذاكرة التخزين المؤقت، أو يمكنك التكرار خلال المحتويات:

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

نصائح أخرى

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

يمكنك التعداد من خلال الكائنات:

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

فيما يلي وظيفة VB للتكرار من خلال ذاكرة التخزين المؤقت وإرجاع تمثيل DataTable.

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

قد يكون هذا متأخرا بعض الشيء، لكنني استخدمت التعليمات البرمجية التالية للتكرار بسهولة على جميع عناصر ذاكرة التخزين المؤقت وأداء بعض المنطق المخصص لإزالة عناصر ذاكرة التخزين المؤقت التي تحتوي على سلسلة معينة بأسمائها.

لقد قدمت كلا الإصدارين من التعليمات البرمجية في VB.NET وكذلك C #.

نسخة 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

C # الإصدار

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

لأنك يحتمل أن ترغب في إزالة العناصر من 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.

جيف، يجب عليك حقا البحث عن التبعيات عن العناصر المخزنة مؤقتا. هذه هي الطريقة الصحيحة للقيام بذلك. قم بتجميع بياناتك المخزنة مؤقتا (العناصر) والتبعية الإعداد لمجموعتك. بهذه الطريقة عندما تحتاج إلى إنهاء المجموعة بأكملها تلمس مثل هذا الاعتماد المشترك وذهب كلها.

لست متأكدا من أنني أفهم قائمة الكائن جزء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top