【问题标题】:System.Runtime.Caching doesn't release BitmapImage objectsSystem.Runtime.Caching 不释放 BitmapImage 对象
【发布时间】:2012-01-25 23:33:03
【问题描述】:

我在我的应用程序中使用新的 System.Runtime.Caching 库进行缓存,并在 App.config 中定义如下:

<system.runtime.caching>
    <memoryCache>
        <namedCaches>
            <add name="MyCache" cacheMemoryLimitMegabytes="10"
                 physicalMemoryLimitPercentage="30" pollingInterval="00:00:10" />
        </namedCaches>
    </memoryCache>
</system.runtime.caching>

然后,我从代码中将其实例化如下:_cache = new MemoryCache("MyCache");

并添加这样的条目:_cache.Add(resourceName, resource, new CacheItemPolicy());

我使用这个缓存来存储BitmapImage 对象,并且为了确保缓存正常工作,我在缓存中添加了十个BitmapImage 对象,每个对象包含一个大约7MB 的图像。然后我等了十秒钟让轮询发生并检查缓存中的条目,但它们都在那里。没有一个对象被驱逐。

我在这里做错了吗?我知道设置是从 App.config 正确读取的。 BitmapImage 实例本身是否可能很小并且仅引用磁盘上的图像?以及缓存如何确定对象的大小?

【问题讨论】:

    标签: c# .net wpf caching .net-4.0


    【解决方案1】:

    这是因为您要添加到缓存中

    new CacheItemPolicy()
    

    这将覆盖您的值并为您提供默认值,即 AbsoluteExpiration 为 31/12/9999 11:59:59 PM +00:00

    做 10 分钟,你有 2 个选择

    CacheItemPolicy item = new CacheItemPolicy();
    
    item.SlidingExpiration = new TimeSpan(0, 10, 0);
    

    item.AbsoluteExpiration = DateTime.Now.AddMinutes(10);
    

    如果您选择滑动到期,则在更新对象时 10 分钟将重置。

    【讨论】:

    • 我已经用char[] 对此进行了测试,即使我使用了new CacheItemPolicy(),项目也被驱逐了。无论哪种方式,为了将项目添加到缓存中,我都必须提供一个 CacheItemPolicy 参数。我需要传递什么值才能获得请求的行为?
    • 这仍然没有给我要求的行为。我不想明确设置项目过期的时间 ​​- 如果超出app.config 中定义的内存限制,我希望它们过期。另外,我很确定您对 31/12/9999 11:59:59 PM +00:00 到期的项目是错误的,因为正如我在上面的评论中所说,我确实让项目到期,即使我使用new CacheItemPolicy() 策略添加它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2011-07-15
    • 2015-09-25
    • 2012-09-17
    • 1970-01-01
    相关资源
    最近更新 更多