我正在用C#编写一个控制台应用程序,我希望在预定义的时间内缓存某些项目(假设1小时)。我希望已添加到此缓存中的项目在过期后自动删除。我可以使用内置数据结构吗?请记住,这是一个控制台应用程序而不是Web应用程序。
答案 0 :(得分: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}
}
答案 1 :(得分:6)
它已经在BCL了。它不是你期望找到它的地方:你也可以从其他类型的应用程序中使用System.Web.Caching,而不仅仅是在ASP.NET中。
This search on google links to several resources about this.
答案 2 :(得分:3)
我不知道BCL中有任何这样做的对象,但我之前也写过类似的东西。
只需在缓存类中包含System.Threading.Timer(无web / winforms依赖项),并在对象上存储过期(或上次使用)时间,即可轻松完成此操作。只需每隔几分钟检查一次计时器,然后删除想要过期的对象。
但是,要注意对象上的事件。我有一个这样的系统,并且不会非常小心地取消订阅缓存中我的对象上的事件,这阻止了随着时间推移的微妙但令人讨厌的记忆泄漏。这可能非常难以调试。
答案 3 :(得分:3)
在要缓存的对象中包含一个ExpirationDate属性(可能是真实对象的包装器),并将其设置为在其构造函数中一小时后到期。不是从集合中删除项目,而是通过过滤掉过期项目的方法来访问集合。或者创建自动执行此操作的自定义集合。如果您需要从缓存中实际删除项目,则您的自定义集合可以在每次调用其成员时清除过期项目。