有没有办法通过缓存查看缓存中的所有对象?我正在动态创建对象,我需要定期浏览列表以清除我不再使用的对象。
答案 0 :(得分:17)
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);
}
答案 1 :(得分:6)
您可以枚举对象:
System.Web.HttpContext.Current.Cache.GetEnumerator()
答案 2 :(得分:5)
是的,您可以根据缓存键进行索引,也可以迭代内容:
For Each c In Cache
' Do something with c
Next
' Pardon my VB syntax if it's wrong
答案 3 :(得分:3)
这是一个VB函数,用于迭代Cache并返回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
答案 4 :(得分:3)
这可能有点晚了,但我使用以下代码轻松迭代所有缓存项并执行一些自定义逻辑,以删除名称中包含特定字符串的缓存项。
我在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);
}
答案 5 :(得分: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
类型。
答案 6 :(得分:1)
我不确定我理解对象列表部分。