2011-12-22 21 views
5

我使用新System.Runtime.Caching庫在我的應用程序緩存,並且在App.config定義如下它:System.Runtime.Caching不釋放的BitmapImage對象

<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對象,並確保高速緩存正常工作,我已經增加了10 BitmapImage個對象緩存,每個緩存大約7MB的圖像。然後,我等待了十秒鐘的輪詢發生並檢查了緩存中的條目,但他們都在那裏。沒有一個物體被驅逐。

我在這裏做錯了什麼?我知道這些設置是從App.config中正確讀取的。是否有可能BitmapImage實例本身很小,只能引用磁盤上的映像?高速緩存如何確定對象的大小?

回答

3

這是因爲你要添加到緩存中

new CacheItemPolicy() 

這將覆蓋你的價值觀,給你的默認值,這是31/12/9999下午11:59:59 +00的AbsoluteExpiration :00

做了10分鐘,你有2個選項

CacheItemPolicy item = new CacheItemPolicy(); 

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

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

如果你選擇了滑動過期,如果你更新對象10分鐘就會復位。

+0

我用'的char []'進行了測試,項目被拆遷戶即使我用'新CacheItemPolicy()'。無論哪種方式,爲了添加一個項目到緩存中,我必須提供一個'CacheItemPolicy'參數。爲了獲得所要求的行爲,我需要傳遞什麼值? – 2012-01-05 19:23:09

+0

更新了我的答案 – 2012-01-06 03:11:53

+0

這仍然不會給我所要求的行爲。我不想明確設置項目過期的時間 ​​- 如果超過了'app.config'中定義的內存限制,我希望它們過期。另外,我很肯定你對於在31/12/9999 11:59:59 PM +00:00到期的項目是錯誤的,因爲正如我在上面的評論中所說的那樣,即使當我添加他們與政策'新CacheItemPolicy()'。 – 2012-01-06 11:36:43