首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MemoryCache Empty :设置后返回null

MemoryCache Empty :设置后返回null
EN

Stack Overflow用户
提问于 2011-09-15 04:55:00
回答 5查看 23.6K关注 0票数 52

我在使用新的.NET 4 System.Runtime.Caching MemoryCache的MVC3应用程序上遇到了问题。我注意到,在一段看似不可预测的时间之后,它停止缓存内容,并表现为空的。考虑我直接从ASP.NET MVC中的测试视图中摘取的这段代码:

代码语言:javascript
复制
MemoryCache.Default.Set("myname","fred", new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0,5,0) });
Response.Write(MemoryCache.Default["myname"]);

当它工作时,可以预见的是"fred“会被打印出来。但是,当问题开始出现时,尽管有Set()MemoryCache.Default["myname"]的值仍为null。我可以通过在Response.Write()行上设置断点并使用即时窗口直接设置和读取缓存来证明这一点-它只是不设置它并保持为空!那么,让它再次工作的唯一方法就是引发AppDomain循环。

有趣的是,当应用程序正常工作时,我可以通过中断Response.Write()行并运行MemoryCache.Default.Dispose()来引发问题。在那之后,MemoryCache.Default本身就不是空的(为什么呢?),但不会保存在它上面设置的任何内容。它不会导致任何错误,但不会保存任何内容。

有没有人能证实并解释这一点?我相信我已经发现,当应用程序停止自己的工作时,有什么东西在处理MemoryCache.Default,但不是我!

更新

好吧,我现在受够了这个问题了!CLRProfiler似乎不适用于MVC3。SciTech的CLR工具很好用-- RedGate ANTS也是如此。但是他们告诉我的是MemoryCache对象正在被某个东西释放!我还证明(通过时间戳打印)我的页面上应该缓存(由OutputCacheAttribute指定)的PartialView在几分钟后停止缓存-它会在每次调用页面时开始刷新。为了澄清环境,我直接在我的开发工作站上的IIS 7.5服务器上运行Win 7 Ultimate。上面提到的内存工具表明,就游戏中的对象而言,我只使用了大约9mb内存。

无奈之下,我更改了缓存代码,首先搜索要挂接的环境HttpContext,并使用其缓存功能(如果有)。早期的测试表明这是可靠的,但感觉像是一个讨厌的黑客攻击。

我有一种感觉,MemoryCache和OutputCache没有资格使用MVC3。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-30 15:07:04

所以,这里有一些消息。我们对此进行了调查,是的,这是.NET 4中的一个错误。

好消息是这个问题已经在.NET 4.5中修复了,所以如果可以的话,把你的安装更新到.NET 4.5就可以了。

另一个好消息是,这个修复已经被移植到.NET 4,并将作为QFE (快速修复...你将应用的一次性修复) #578315提供。它是在几天前被反向移植/修复的,应该尽快发布。我会尽量弄到一个确切的日期,但很快就到了。

另一个好消息是,在QFE之前的.NET 4上有一个解决方案。这个变通方法很奇怪,但它可以解除你的阻碍。

代码语言:javascript
复制
using (ExecutionContext.SuppressFlow())     {
          // Create memory cache instance under disabled execution context flow
         return new YourCacheThing.GeneralMemoryCache(…);
}

希望这能有所帮助。

更新:修补程序是http://support.microsoft.com/kb/2828843,你可以在这里请求它:https://support.microsoft.com/contactus/emailcontact.aspx?scid=sw;%5BLN%5D;1422

票数 70
EN

Stack Overflow用户

发布于 2013-03-04 22:15:44

我们也有同样的问题。我确认在一段时间后缓存被释放了。它的私有字段_disposed变成了1。我确信我的代码中没有调用cache.Dispose。但是当我使用Reflector查看MemoryCache的代码时,我发现在构造函数中它订阅了两个事件

代码语言:javascript
复制
domain.DomainUnload += eventHandler;
domain.UnhandledException += exceptionEventHandler;

private void OnAppDomainUnload(object unusedObject, EventArgs unusedEventArgs)
{
  this.Dispose();
}

private void OnUnhandledException(object sender, UnhandledExceptionEventArgs eventArgs)
{
  if (!eventArgs.IsTerminating)
    return;
  this.Dispose();
}

这两个事件处理程序都调用Dispose。可能是在IIS中的一些域回收之后,它会导致域卸载,但会将缓存保留在内存中(如果可能的话,我不是舒尔)。

票数 6
EN

Stack Overflow用户

发布于 2012-11-22 05:38:14

我一直在经历完全相同的症状。我最终使用了System.Web.Cache类,并挂接到了HttpContext.Cache。在过去的三天里,它一直工作得很好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7422859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档