内存缓存在 .Net Framework 4 中不起作用
Memory Cache not working in .Net Framework 4
我的项目是建立在 .Net Framework 4.0 上的,我们使用 ObjectCache
作为 MemoryCache
内置,它在 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 为目标的示例应用程序可以运行。我想知道是否还有其他人经历过类似的行为,我怎样才能触及这个问题的核心?有什么工具可以提供帮助吗?
终于找到错误原因了。我正在处理具有容器控制的 Cache 实例的容器。当容器在处理时,它也在处理我的缓存。而且它无法在已处置的缓存对象上设置值。它应该抛出异常但它没有,因此整个混乱。未来的读者请注意。
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));
}
我的项目是建立在 .Net Framework 4.0 上的,我们使用 ObjectCache
作为 MemoryCache
内置,它在 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 为目标的示例应用程序可以运行。我想知道是否还有其他人经历过类似的行为,我怎样才能触及这个问题的核心?有什么工具可以提供帮助吗?
终于找到错误原因了。我正在处理具有容器控制的 Cache 实例的容器。当容器在处理时,它也在处理我的缓存。而且它无法在已处置的缓存对象上设置值。它应该抛出异常但它没有,因此整个混乱。未来的读者请注意。
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));
}