2013-06-19 91 views
2

我正在硬性实施解决此线程中提到的Cache问题MemoryCache Empty : Returns null after being set的解决方法。MVC中的MemoryCache.Default处置解决方法

我的最新尝试,具有下面的代码来获得一个实例,包裹的建议,在using语句来抑制从设置在缓存:

private static CacheDl _instance; 
public static CacheDl Instance 
{ 
    get 
    { 
     if (_instance == null) 
     { 
      using (ExecutionContext.SuppressFlow()) 
      { 
       _instance = new CacheDl(); 
      } 
     } 

     return _instance; 
    } 
} 

private static ObjectCache Cache { get { return MemoryCache.Default; } } 

当然,这也不行。我有也尝试用类似的方式封装Cache'getter',但仍然没有成交。

我也试过指定一个大的pollingInterval来完全压制行为,但仍然没有成功。

private ObjectCache _cache; 
private ObjectCache Cache 
{ 
    get 
    { 
     using (ExecutionContext.SuppressFlow()) 
     { 
      return _cache ?? (_cache = new MemoryCache("my-cache", new NameValueCollection { { "pollingInterval", "30:00:00" } })); 
     } 
    } 
} 

你猜对了,没有运气。任何帮助将不胜感激。

顺便说一句,我已经申请提到的修复包从Microsoft,但尚未听说回来后已经提交请求4小时什么..

老实说,我真的喜欢,这将被卷起来成官方的Windows Update,所以我们不必为了在非.NET 4.5系统上运行而破解它。

更新: 具体来说,我想知道我是如何实施建议的解决方法。有人可以展示一个如何实现这个例子吗?

回答

0

用配置设置对此进行排序,以便将缓存轮询时间间隔延长到足以使应用程序池在达到时间间隔之前回收的时间间隔。在构建Cache实例时尝试过这样做,但没有成功。

对相关连接问题的评论提到,如果您可以控制应用程序池,而另一个人在此提到social.msdn论坛。

Connect Issue

social.msdn

其通过30小时增加轮询间隔的配置设置:

<system.runtime.caching> 
    <memoryCache> 
     <namedCaches> 
      <add name="Default" 
       cacheMemoryLimitMegabytes="0" 
       physicalMemoryLimitPercentage="0" 
       pollingInterval="30:00:00" /> 
     </namedCaches> 
    </memoryCache> 
</system.runtime.caching> 
1

我正在处理同样的问题。在我的情况下,问题似乎是缓存放置在AppDomain的UnhandledException事件上。查看MemoryCache here的源代码片段。

正如您所看到的,它会自行处理。我的解决方案是将我的缓存访问包装在可订阅此事件的类中,并在旧的缓存被处置时初始化新的缓存。这个解决方案似乎适用于我,但它确实感觉相当不错。

缓存仍然会在UnhandledException事件中被意外清除,但至少您可以通过这种方式重新使用新的缓存。

public class MyCacheWrapper 
{ 
    private MemoryCache cache; 
    public MyCacheWrapper() 
    { 
     cache = new MemoryCache("settings"); 
     AppDomain.CurrentDomain.UnhandledException += (sender, args) => 
      { 
       if(args.IsTerminating) 
        cache = new MemoryCache("settings"); 
      }; 
    } 
} 

还要注意的是,你还可以使用这个类来处理并重新创建缓存时要清除它,因为的MemoryCache的TRIM()方法不能正常工作。

+0

感谢您的回答,我结束了这避免了长轮询配置设置会Cache的内部处理。我试图在代码中应用该设置,因为任何原因该代码无法工作,但是在配置中设置值解决了问题,并且我现在还没有任何“处置”缓存问题。 –

+0

谢谢,后来我发现矿井被首先处置的原因是由于我的开发环境中配置不正确,但由于这个问题和其他问题,加上为了安全起见,以防其他错误导致处置,我最终只是改变它使用System.Web.Caching.Cache。 – mao47