所以我在System.Runtime MemoryCache周围编写了几个包装器方法,以便在我的ASP.NET MVC应用程序中为每个viewmodel获取一般/用户绑定的缓存上下文。
在某些时候,我注意到我的委托每次都不停地被调用,而不是没有明显的原因检索我存储的对象。
奇怪的是,我的单元测试(使用简单数据检查)都没有失败,或者显示出解释的模式。
这是包装方法之一:
public T GetCustom<T>(CacheItemPolicy cacheSettings, Func<T> createCallback, params object[] parameters)
{
if (parameters.Length == 0)
throw new ArgumentException("GetCustom can't be called without any parameters.");
lock (_threadLock)
{
var mergedToken = GetCacheSignature(parameters);
var cache = GetMemoryCache();
if (cache.Contains(mergedToken))
{
var cacheResult = cache.Get(mergedToken);
if (cacheResult is T)
return (T)cacheResult;
throw new ArgumentException(string.Format("A caching signature was passed, which duplicates another signature of different return type. ({0})", mergedToken));
}
var result = createCallback(); <!-- keeps landing here
if (!EqualityComparer<T>.Default.Equals(result, default(T)))
{
cache.Add(mergedToken, result, cacheSettings);
}
return result;
}
}
我想知道这里是否有人知道在MemoryCache中存储对象无效的条件。
在此之前,我只是剥离了复杂的课程&#39;属性直到存储工作。
然而,经验会很有趣。
答案 0 :(得分:1)
有几个常见的原因可能发生(假设正确的逻辑实际添加对象到缓存/找到正确的缓存实例):
注释