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

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

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

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

我可以用什么想法?

在框架中,几乎拥有您想要的function – ConcurrentQueue 。 它是线程安全的队列,大多数操作都是无锁实现的,所以它非常快。

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

但是这可以很容易地添加 – 只需创建自己的包含私有ConcurrentQueue的类,并通过在排队新元素之前出列/抛弃直到满足限制来实现公共入队方法中的“丢弃部分”。

编辑 – 根据评论
一种选择是使第二个“队列”成为一个ObservableCollection – 虽然本质上不是线程安全的(注意),但这很容易在WPF中绑定…

另一种方法是让你的类实现ObservableCollection接口(它由IList, ICollection, IEnumerable, IList, ICollection, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged ) – 听起来很多,但大多数都是您可以通过中继到内部ConcurrentQueue轻松实现,因此没有太多真正的代码可以写…
请参阅http://msdn.microsoft.com/en-us/library/ms752347.aspx

您可以从Rx尝试new ReplaySubject(int count) ,它会从观察到的事件流中缓冲最后的count对象。

http://msdn.microsoft.com/en-us/library/hh229429.aspx

如果你需要一个更传统的编程模型(Rx稍微有点),那么可以试试TPL DataFlow BroadcastBlock 。 广播在电视广播中命名 – 如果帧没有被“处理”得足够快,则它被丢弃,因此处理与“实时”帧保持相关。

http://msdn.microsoft.com/en-us/library/hh160447.aspx

更新:ReplaySubject重放第一个X,它不是FIFO队列,它是’First X List’。