具有自动大小限制管理的ThreadSafe FIFO列表
我正在试图找出要使用的数据类型……基本上我想要一个线程安全的FIFO队列,并且一旦达到预先指定的限制就会自动丢弃足够多的项目。
嗯,实际上,也许更多的是列表,因为我不想要推入队列并从队列中弹出一个项目的整个概念,此时它已不再可用。
用例基本上是一个播放列表,我最多可以有5个即将到来的项目,当前正在播放的项目,然后是大约20个已播放的项目。 因此,为什么我猜它不能是一个队列,我将访问中间的一个项目作为“当前”项目。 当列表变得很大时,我宁愿不必手动管理扔掉旧物品……显然我可以自己写这些,但如果C#已经存在,我不想重新发明轮子。
我可以用什么想法?
在框架中,几乎拥有您想要的function – ConcurrentQueue
。 它是线程安全的队列,大多数操作都是无锁实现的,所以它非常快。
唯一的function是没有自动“扔掉”的“限制”……
但是这可以很容易地添加 – 只需创建自己的包含私有ConcurrentQueue
的类,并通过在排队新元素之前出列/抛弃直到满足限制来实现公共入队方法中的“丢弃部分”。
编辑 – 根据评论 :
一种选择是使第二个“队列”成为一个ObservableCollection
– 虽然本质上不是线程安全的(注意),但这很容易在WPF中绑定…
另一种方法是让你的类实现ObservableCollection
接口(它由IList
) – 听起来很多,但大多数都是您可以通过中继到内部ConcurrentQueue
轻松实现,因此没有太多真正的代码可以写…
请参阅http://msdn.microsoft.com/en-us/library/ms752347.aspx
您可以从Rx尝试new ReplaySubject
,它会从观察到的事件流中缓冲最后的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’。