httpcontext.current.cache中的对象列表

时间:2009-07-06 18:31:39

标签: asp.net .net vb.net caching httpcontext

有没有办法通过缓存查看缓存中的所有对象?我正在动态创建对象,我需要定期浏览列表以清除我不再使用的对象。

7 个答案:

答案 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)

杰夫,你应该真正查找缓存项目的依赖项。这是这样做的正确方法。逻辑分组您的组的缓存数据(项)和设置依赖项。这样,当你需要使整个群体到期时,你会触及这种共同的依赖关系并且它们都已经消失了。

我不确定我理解对象列表部分。