قائمة الكائن في httpccontext.current.cache
-
23-08-2019 - |
سؤال
هل هناك طريقة للنظر في ذاكرة التخزين المؤقت لجميع الكائنات في ذاكرة التخزين المؤقت؟ أنا أخلق كائنات ديناميكيا وأحتاج إلى الذهاب بشكل دوري من خلال القائمة لتنقية الكائنات التي لم أعد أستخدمها.
المحلول
نعم، يمكنك إما فهرس يستند إلى مفتاح ذاكرة التخزين المؤقت، أو يمكنك التكرار خلال المحتويات:
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
.
جيف، يجب عليك حقا البحث عن التبعيات عن العناصر المخزنة مؤقتا. هذه هي الطريقة الصحيحة للقيام بذلك. قم بتجميع بياناتك المخزنة مؤقتا (العناصر) والتبعية الإعداد لمجموعتك. بهذه الطريقة عندما تحتاج إلى إنهاء المجموعة بأكملها تلمس مثل هذا الاعتماد المشترك وذهب كلها.
لست متأكدا من أنني أفهم قائمة الكائن جزء.