0

我的项目是建立在 .Net Framework 4.0 上的,我们使用的是内置的ObjectCacheMemoryCache它是在 .Net 中实现的System.Runtime.Caching

它以前工作正常,但突然停止在缓存中保存任何内容。当我在缓存上调用Set方法时,它不会保存任何内容,并且Result View始终为空,说明Enumeration yielded no results. 我仔细检查了代码,发现那里没有任何问题。这真的很简单,如下所示:

var policy = new CacheItemPolicy();
cache = new MemoryCache("MyCache");
cache.Set("item", "item value", policy);
var item = cache.Get("item");
cache.Remove("item"); //when removal is required

但是,在同一台机器上针对 .Net Framework 4 的示例应用程序可以工作。我想知道是否有其他人经历过类似的行为,我怎样才能找到这个问题的核心?有什么工具可以提供帮助吗?

4

1 回答 1

0

我终于找到了错误的原因。我正在处理具有容器控制的缓存实例的容器。当容器正在处理时,它也在处理我的缓存。而且它无法在已处置的缓存对象上设置值。它应该抛出异常,但它没有,因此整个混乱。未来的读者请注意。

var CachingPolicy = new CacheItemPolicy();
var Cache = new MemoryCache("YourCacheName");
container.RegisterInstance(CachingPolicy);
container.RegisterInstance(Cache);

container.Dispose(); //disposes cache as well. But calling methods on cache object won't throw exception.

//at this point, you should create the cache again, like
CachingPolicy = new CacheItemPolicy();
Cache = new MemoryCache("YourCacheName");
container.RegisterInstance(CachingPolicy);
container.RegisterInstance(Cache);

通过 ILSpy进一步挖掘MemoryCache代码清除了这一点,如果对象被处置,它不会设置任何内容。

if (IsDisposed)
{
    if (collection != null)
    {
        foreach (ChangeMonitor item in collection)
        {
            item?.Dispose();
        }
    }
}
else
{
    MemoryCacheKey memoryCacheKey = new MemoryCacheKey(key);
    MemoryCacheStore store = GetStore(memoryCacheKey);
    store.Set(memoryCacheKey, new MemoryCacheEntry(key, value, absExp, slidingExp, priority, collection, removedCallback, this));
}
于 2018-10-20T20:17:26.670 回答