假设我有一个类似下面的片段,它返回 Context.Cache["someComplexObject"] 的内容:
public class Something {
private static SortedDictionary<Guid, Object> ComplexObjectCache
{
get
{
if (Context.Cache["someComplexObject"] == null)
{
FillCache();
}
return (SortedDictionary<Guid, Object>)Context.Cache["someComplexObject"];
}
set
{
Int32 seconds = (new Random()).Next(120, 180);
Context.Cache.Add(
"someComplexObject",
value,
null,
DateTime.Now.AddSeconds(seconds),
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.NotRemovable,
null
);
}
}
}
在用户控件中,假设我有这个:
Object o = Something.ComplexObjectCache[someGuid];
/*
do some other stuff ...
*/
DoSomethingWith(o);
在非常罕见的情况下,我会看到一些异常,这些异常让我相信当DoSomethingWith(o)被击中时o不再在内存中。我 97% 确定没有其他并行进程发生,除了缓存在做什么。我看到其他奇怪的现象让我相信缓存键是空的或不完整的。
即使在其他地方仍有指向它的指针,缓存能否/是否真的从内存中删除一个对象?如果是这样,我该如何对抗?
更新
经过进一步挖掘,我发现我们有一个相关的缓存项(索引),当它在“主”缓存项之前过期时会导致问题。我已经重做了这个实体的缓存代码,将这两个结构一起存储在一个对象数组中。这似乎解决了这个问题。
你们都没有足够的信息来解决问题。因此,我将查看答案,并对似乎最准确地解决了给定问题的答案打勾。