2009-04-09 37 views
2

我正在寫一個控制檯應用程序在C#中,我想緩存某些項目預定義的時間(比如說1小時)。我希望已添加到此緩存中的項目在到期後自動刪除。是否有可以使用的內置數據結構?請記住,這是一個控制檯應用程序不是一個Web應用C#集合的項目到期

回答

3

我不知道BCL中有任何這樣做的對象,但我寫過類似的東西。

只需在緩存類中包含System.Threading.Timer(不包括web/winforms依賴關係),並在對象上存儲到期(或最後使用)時間,就可以非常容易地完成此操作。只需讓計時器每隔幾分鐘檢查一次,並刪除要過期的對象。

但是,請注意您的物體上的事件。我有一個這樣的系統,並沒有非常小心地取消訂閱緩存中的對象上的事件,這可以防止隨着時間的推移發生微妙的但令人討厭的memeory泄漏。調試起來可能非常棘手。

6

那你真的需要從緩存中刪除它們嗎?或者只是將來對該項目的緩存請求應該在給定時間後返回null?

要做到前者,您需要一些定期清除緩存的後臺線程。這隻會在你擔心內存消耗或其他問題時才需要。如果你只是想讓數據過期,那很容易。

創建這樣的類是微不足道的。

class CachedObject<TValue> 
{ 
DateTime Date{get;set;} 
TimeSpan Duration{get;set;} 
TValue Cached{get;set;} 
} 

class Cache : Dictionary<TKey,TValue> 
{ 
    public new TValue this(TKey key) 
    { 
    get{ 
    if (ContainsKey(key)) 
    { 
     var val = base.this[key]; 
     //compare dates 
     //if expired, remove from cache, return null 
     //else return the cached item. 
    } 
    } 

    set{//create new CachedObject, set date and timespan, set value, add to dictionary} 

    } 
3

包括在你將被緩存(大概是你的真實對象的包裝),把它在它的構造一個小時到期對象的到期日期屬性。不是從集合中刪除項目,而是通過過濾掉過期項目的方法來訪問集合。或者創建一個自動執行此操作的自定義集合。如果您需要從緩存中實際刪除項目,那麼您的自定義集合可能會在每次調用其成員之一時清除過期項目。

6

它已經在BCL。它只是不在你期望的地方:你也可以從其他類型的應用程序中使用System.Web.Caching,而不僅僅是在ASP.NET中。

This search on google links to several resources about this.

+3

使用的MemoryCache代替http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.100).aspx看到:HTTP://計算器.com/a/793720/303290 tl; dr:「如果Cache對象在ASP.NET之外使用,則爲Cache對象保留的系統內存不會被釋放」 – mbx 2012-10-23 09:12:19