2011-06-27 19 views
14

我需要这样的功能:列表与超时/到期能力

AddToList(txtName, timeExpire); 

它看起来像自我描述,该项目将自动过期,并从列表中删除。

我无法想象如何做到这一点。任何人都可以给我一个线索吗?

+1

这叫做'cache'。 – leppie

+3

线索:创建一个这样的数据结构 – crashmstr

+0

如果你使用的是asp.net,它的缓存类将为你做这件事。 –

回答

7

你也可以尝试这样的事情。

创建一个自定义类

public class Custom 
    { 
     string item; //will hold the item 
     Timer timer; //will hanlde the expiry 
     List<Custom> refofMainList; //will be used to remove the item once it is expired 

     public Custom(string yourItem, int milisec, List<Custom> refOfList) 
     { 
      refofMainList = refOfList; 
      item = yourItem; 
      timer = new Timer (milisec); 
      timer.Elapsed += new ElapsedEventHandler(Elapsed_Event); 
      timer.Start(); 
     } 

     private void Elapsed_Event(object sender, ElapsedEventArgs e) 
     { 
      timer.Elapsed -= new ElapsedEventHandler(Elapsed_Event); 
      refofMainList.Remove(this); 

     } 
    } 

现在你可以创建List<Custom>并使用它。一旦指定时间结束,项目将被删除。

+0

一个类似的解决方案对我很好。在我的情况下,我创建了一个单例将缓存的值保存在ConncurrentDictionary中。然后我使用时间事件每隔一段时间清除缓存的值。我用滑动过期。 –

+2

该方法如何在IIS中运行的asp.net API中工作。我相信在iis中运行计时器有复杂性? – Zapnologica

3

您将需要创建一个可以管理它的对象。

想想每个项目需要存储什么。基本上,数据(例如txtName)和到期时间。这意味着你可能需要一个只有这2个元素的类或结构。

您的ExpiringList类将是该类型的列表。

现在你有了你的基本数据结构(一个集合/列表ExpiringListItem),你需要考虑你想要支持的操作。目前你已经列出了AddToList,其他人可能是RemoveFromList,Clear,也可能迭代所有项目。

与正常的List<T>相比,ExpiringList唯一唯一的事情是您要自动删除过期的物品。因此,使您的ExpiringList实现接口IList<T>并在内部使用私有列表是有意义的,可能您可以使您的列表(并且必要时为ExpiredListItem类)通用。

棘手的部分,超出理解和实现继承(真的是一个单独的问题),正在制定如何删除过期的项目。

这意味着要在您的课程中创建一个方法,对您的项目进行迭代(以相反顺序),将其到期时间与当前时间进行比较并删除过期时间。

只需调用内部列表中的适当方法即可实现该接口。

您可以说到此为止,因为您只是定期调用该方法,以确保在使用列表中的项目之前,所有过期的项目都已消失。

也许更好的选择是在内部列表上运行该方法之前调用此方法。根据你将如何使用你的列表,这可能是矫枉过正。

+1

总之;我将使用定时器定期检查过期的项目。 –

+0

@尼姆,这将工作,或者你可以使用我最后一段的建议(如果你确实想让一个类来管理这个,而不是一个单一的方法在列表上工作)。 –

21

如果您的目标是.NET 4或更高版本,请使用MemoryCache(或从ObjectCache派生您的自定义实现)。

早在4之前,如果你想要在你的应用程序缓存,你可以简单地System.Web.Cache,并在任何.NET应用程序中使用。它没有任何真实依赖任何“网络”代码,但它确实需要你参考System.Web.dll。这看起来很奇怪(就像引用Microsoft.VisualBasic一样。DLL从一个C#应用程序),但实际上并没有实际影响你的应用程序。

随着Client Profile的出现,突破了以桌面为中心的代码和以服务器为中心的代码之间的依赖性变得非常重要。因此引入了ObjectCache,以便桌面应用程序(不清楚silverlight,wp7)开发人员可以打破这种依赖关系,并且只能定位客户端配置文件。

+0

3.5还没有。我会记住的。 –

11

只是威尔给了

添加参考System.Runtime.Caching

回答一个简单的例子
MemoryCache cache = new MemoryCache("CacheName"); 

cache.Add(key, value, new CacheItemPolicy() 
          { AbsoluteExpiration = DateTime.UtcNow.AddSeconds(20) }); 

然后,您可以检查,如果事情是仍在缓存转到

if (cache.Contains(key)) 

如果你想让你的缓存时间限制较低,那么你需要用一个很好的小黑客来改变缓存的刷新时间。

MemoryCache AbsoluteExpiration acting strange

+0

你得到并发内存缓存吗?基本上C#'ConcurrentDictionary'具有过期的功能? – Zapnologica

+2

@Zapnologica MemoryCache完全是线程安全的,请参阅此答案:http://stackoverflow.com/a/6738179/606554 – elbweb