我正在寫一個控制檯應用程序在C#中,我想緩存某些項目預定義的時間(比如說1小時)。我希望已添加到此緩存中的項目在到期後自動刪除。是否有可以使用的內置數據結構?請記住,這是一個控制檯應用程序不是一個Web應用C#集合的項目到期
2
A
回答
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.
相關問題
- 1. C#集合結合項目
- 2. 添加項目到集合集合
- 3. C++/CLI:添加項目管理集合
- 4. Team Foundation Server:將集合的項目克隆到新集合中
- 5. C#無法將項目添加到觀察的集合
- 6. 如何將現有項目添加到C#中的集合中#
- 7. Java將項目添加到集合
- 8. 動態添加項目到集合
- 9. 添加/刪除項目到包集合
- 10. 推送項目到Mongodb集合數組
- 11. WPF綁定My.Settings集合到Combobox項目
- 12. 項目不添加到集合
- 13. $在項目插入到集合之前觀看集合更改
- 14. 如何合併列表中的項目<>集合C#
- 15. C#合併2個集合的不同項目
- 16. 關於C#項目的項目合作
- 17. MongoDB - 重複項目集合
- 18. 集合視圖indexpathforitematpoint項目
- 19. NHibernate和添加一個複合集合的新項目到一個子集合
- 20. 項目從兒童收集實體集成到dtos集合
- 21. mongodb將項目推到聚合集合的頂部
- 22. 結合GDAL到2008年MSVS C++項目
- 23. WPF使用僅集合的項目的子集綁定到一個組合
- 24. 合併TFS團隊項目集合
- 25. 如果集合尚未包含項目的屬性,則將項目添加到集合中?
- 26. 將可觀察集合中的Observable集合綁定到列表框項目
- 27. 添加項目到新的集合,而不是替換整個集合
- 28. 綁定列表框項目源到Windows Phone 7中的集合集合
- 29. C++集合集合
- 30. TPL數據流:將收到的收集整合到sequentiel項目
使用的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