在System.Runtime.Caching中,是否有一种方法可以强制限制MemoryCache的大小?

24
我正在使用 .net 4 内存缓存。我希望限制缓存大小,比如说10MB,因为我不想让我的应用程序过多地占用缓存空间。
同时,我也想知道当前缓存的内存占用情况。请问在运行时我该如何查询?
3个回答

46

您可以使用应用程序配置文件中的namedCaches元素,指定专用于MemoryCache的最大物理内存量;或者通过在传递给构造函数NameValueCollection中添加一个键为cacheMemoryLimitMegabytes且值为10的条目来在创建MemoryCache实例时传递该设置。

以下是namedCaches配置元素的示例:

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

以下是你在创建过程中如何配置MemoryCache

//Create a name / value pair for properties
var config = new NameValueCollection();
config.Add("pollingInterval", "00:05:00");
config.Add("physicalMemoryLimitPercentage", "0");
config.Add("cacheMemoryLimitMegabytes", "10");

//instantiate cache
var cache = new MemoryCache("CustomCache", config);

这篇博客文章详细介绍了配置MemoryCache对象的所有方式,其中一些示例是从该来源适配而来。


1
这个大小限制是在什么时候被评估的?是在添加新的缓存条目时还是只在轮询间隔期间进行评估? - Tamas Molnar
根据 pollingInterval 进行异步操作,并结合一些复杂的技巧,您可以通过使用 ILSpy 来查看。 - Ruben Bartelink

11

你可以在配置中这样做...例如...

<system.runtime.caching>
   <memoryCache>
      <namedCaches>
         <add name="Default"
              cacheMemoryLimitMegabytes="52"
              physicalMemoryLimitPercentage="40"
              pollingInterval="00:04:01" />
      </namedCaches>
   </memoryCache>
</system.runtime.caching>

要在代码中完成此操作,请参阅... 这个 MSDN 页面


1
酷!你也能用代码实现吗?你知道如何判断缓存的大小吗? - Jonathon Kresner
1
你应该能够做到,因为它在构造函数中使用配置项作为名称值集合。 - John Sobolewski
你知道的...我之前尝试过这些,但无法让它正常工作...我不确定为什么我留下了一张便签来询问这个问题。我会进一步调查。 - Jonathon Kresner
1
为什么同时使用cacheMemoryLimitMegabytes和physicalMemoryPercentage?我认为只使用其中一个更合理。 - Canacourse

8

目前似乎无法强制执行缓存分配的最大内存限制。参考此帖子了解更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接