为了账号安全,请及时绑定邮箱和手机立即绑定

是否有“简便的方法”创建队列,在一定的时间后将iten出队?

是否有“简便的方法”创建队列,在一定的时间后将iten出队?

C#
慕码人2483693 2021-05-19 17:22:15
我在这里有一个小问题,我需要一些帮助。我的代码是在网页上进行无穷大搜索的模式,只要发现新内容,就会将其写入文件中。但是,有时,我要收集的信息已经在文件中,但是没有更新,并且我不想在文件中重复输入。因此,我只创建了一个字符串列表,在其中添加了每个条目,并且每次代码找到要查找的内容时,它都会在写入文件之前检查字符串是否已经在该列表中。您可以清楚地看到为什么这不是一个好主意...由于它运行的是24/7,因此此列表将不断扩大。但是有一个问题!我100%确保如果15分钟过去了,我要查找的信息将永远不会重复。因此,我真正想要的是消除此列表中的项目15分钟。我只是想不出简单和/或优雅的方法来做到这一点。或者,我不知道是否有某些数据结构或库可以为我解决这个问题。这就是为什么我要在这里问:创建某种“定时列表”的最佳解决方案是什么,在迭代结束时,在那里存在一会儿的项目会被删除吗?
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

您是否尝试过.NET的内置MemoryCache

您可以设置一个包含绝对超时的缓存策略,我认为这是您想要的。


查看完整回答
反对 回复 2021-05-23
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

您将需要运行一些会定期修剪列表的内容。

我过去所做的是:

  1. 使用ConcurrentBag<Tuple<DateTime, T>>代替List<T>

  2. 使用Tuples袋,存储对象及其添加时间: theBag.Add(Tuple.Create(DateTime.Now, myObject));

  3. 运行一个辅助线程,该线程定期枚举bag,并删除所有“过期”的条目。

这是一种比较活跃的方法,但是非常简单。但是,由于您现在正在使用两个线程,因此必须小心不要死锁。那就是为什么我使用类似的东西ConcurrentBagConcurrent您还可以查看其他收藏集。您提到了一个队列,因此您可以尝试ConcurrentQueue

像其他人建议的那样,快看一下缓存库并权衡一下您的选择。完整的缓存库可能会过大。


查看完整回答
反对 回复 2021-05-23
  • 3 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信