我正在尝试找出要使用的数据类型... 基本上我想要一个线程安全的 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/