6

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

4

7 回答 7

20
        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);
        }
于 2011-09-08T14:37:01.803 回答
6

您可以枚举对象:

 System.Web.HttpContext.Current.Cache.GetEnumerator()
于 2009-07-06T18:35:17.417 回答
5

是的,您可以根据缓存键进行索引,也可以遍历内容:

For Each c In Cache
    ' Do something with c
Next
' Pardon  my VB syntax if it's wrong
于 2009-07-06T18:35:13.437 回答
3

这是一个遍历 Cache 并返回 DataTable 表示的 VB 函数。

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
于 2009-07-06T18:38:12.153 回答
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);
   }
于 2014-08-15T17:58:58.723 回答
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迭代中的每个都是 type DictionaryEntry

于 2009-07-06T18:48:21.460 回答
1

杰夫,你真的应该为你的缓存项目查找依赖项。这是这样做的正确方法。对您的缓存数据(项目)进行逻辑分组,并为您的组设置依赖项。这样,当您需要使整个组过期时,您会触及这种常见的依赖关系,它们都消失了。

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

于 2009-07-10T17:08:03.420 回答