c# - 具有自动大小限制管理的 ThreadSafe FIFO 列表

标签 c# list queue

我正在尝试找出要使用的数据类型... 基本上我想要一个线程安全的 FIFO 队列,一旦达到预先指定的限制就会自动丢弃足够旧的项目。

好吧,实际上,也许更多的是列表,因为我不想要插入队列并从队列中弹出一个项目的整个概念,此时它不再可用。

用例基本上是一个播放列表,其中我最多有 5 个即将播放的项目、当前正在播放的项目以及大约 20 个已经播放的项目。因此,为什么我猜它不能是一个队列,我将访问中间的一个项目作为“当前”项目。而且我宁愿不必在列表变大时手动管理丢弃旧项目……显然我可以自己编写所有这些,但如果 C# 已经存在,我不想重新发明轮子。

有什么我可以使用的想法吗?

最佳答案

在 Framework 中有一些几乎具有您想要的功能的东西 - ConcurrentQueue .它是线程安全的队列,大多数操作都是无锁实现的,所以速度非常快。

唯一没有的功能是自动“扔掉”的“限制”……

但这可以轻松添加 - 只需创建您自己的包含私有(private) ConcurrentQueue 的类即可并在您的公共(public)入队方法中实现“丢弃部分”,方法是在将新元素入队之前出列/丢弃直到满足您的限制。

编辑 - 根据评论:
一种选择是使第二个“队列”成为 ObservableCollection - 尽管本质上不是线程安全的(注意)这很容易在 WPF 中绑定(bind)...

另一种方法是让您的类实现 ObservableCollection 接口(interface)(由 IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged 组成)因此 - 听起来很多,但其中大部分可以通过中继到内部 ConcurrentQueue 轻松实现所以没有太多真正的代码可写...
参见 http://msdn.microsoft.com/en-us/library/ms752347.aspx

关于c# - 具有自动大小限制管理的 ThreadSafe FIFO 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7142247/

相关文章:

python - 使用哈希比较列表中的相似性?

python基础程序练习

c - 指向结构的指针

javascript - 为什么我的 jQuery 队列执行一次后就停止工作?

c# - 在亚马逊S3中创建zip文件夹

c# - 如何在 C# 中获取连接到 PC 的显示器数量?

python - 为什么列表和集合之间的元素检查处理方式不同?

Java - 当文件中的数据超出限制时打印消息?

c# - 必须声明标量变量 "@dom"

c# - 如何将字符串添加到 string[] 数组?没有 .Add 功能