具有超时/过期能力的列表

时间:2011-06-27 12:48:11

标签: c# list

我需要这样的功能:

AddToList(txtName, timeExpire);

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

我无法想象如何做到这一点。谁能给我一个线索?

4 个答案:

答案 0 :(得分:24)

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

回到4之前,如果你想在你的应用程序中使用缓存,你可以简单地抓住System.Web.Cache并在任何.NET应用程序中使用它。它对任何“web”代码都没有任何真正的依赖关系,但它确实需要您引用System.Web.dll。它看起来很奇怪(比如从C#应用程序引用Microsoft.VisualBasic.dll),但实际上并没有对您的应用程序产生负面影响。

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

答案 1 :(得分:12)

只是一个简短的例子,答案将给出

添加对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

答案 2 :(得分:8)

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

创建自定义类

 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>并使用它。一旦指定的时间结束,它的项目将被删除。

答案 3 :(得分:3)

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

考虑每件商品需要存储的内容。基本上,数据(例如txtName)和到期时间。这意味着您可能需要一个只包含这两个元素的类或结构。

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

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

与普通List<T>相比,ExpiringList唯一独有的是您希望自动删除过期的项目。因此,让ExpiringList实现接口IList<T>并在内部使用私有List是有意义的,可能你可以使你的列表(以及必要的ExpiredListItem类)通用。

除了理解和实现继承(实际上是一个单独的问题)之外,棘手的部分是研究如何删除过期的项目。

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

只需调用内部列表中的相应方法即可实现界面。

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

也许更好的选择是在内部列表上运行方法之前调用此方法。根据您使用列表的方式,这可能有点过分。