2011-08-22 36 views
5

我想弄清楚什么样的数据类型使用...基本上我想要一个线程安全的FIFO队列,并会自动抛出足够旧的项目,一旦它到达预先规定的限制。线程安全FIFO列表与自动尺寸限制管理

呃,实际上,也许更多的是一个列表,因为我不想把整个概念推到队列中,并将一个项目从队列中弹出,并且不再提供它。

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

任何想法,我可以使用什么?

+0

我做了一个类似的问题(http://stackoverflow.com/questions/17031718/how-to-limit-blockingcollection-size-but-keep-adding-new-itens-net-limited-siz),我想同样的事情,有限大小的线程安全FIFO。你有没有找到一个好的解决方案? – Pedro77

回答

3

在这个框架中,有几乎所有你想要的功能 - ConcurrentQueue。它是线程安全队列,大多数操作都是无锁的,因此速度非常快。

的唯一功能是没有的是“极限”自动“被扔掉” ......

但可以很容易地添加 - 刚刚创建自己的包含了一个私有ConcurrentQueue类,并实现“抛出部分“通过在排队新元素之前离队/抛出,直到满足您的限制。

编辑 - 按评论
一种选择是让第二个“排队”的ObservableCollection - 虽然不是天生的线程安全(小心),这将在WPF中很容易绑定...

另一种方法是让你的班级实现ObservableCollection接口(其中包含IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged) - 这听起来很棒,但其中大部分可以通过中继到内部ConcurrentQueue轻松实现,因此没有太多真实的代码可供编写。
请参阅http://msdn.microsoft.com/en-us/library/ms752347.aspx

+0

也许对于访问中间部分,我可以创建一个包含两个队列的对象......一个包含即将到来的项目,另一个是已播放的项目列表。如果我可以使用WPF绑定工作,那真是太好了...... –

+0

请参阅我的EDIT关于DataBinding ... – Yahia

1

您可以尝试从Rx获得new ReplaySubject<T>(int count),该缓存来自观察事件流的最后一个count对象。

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

如果你需要一个更传统的编程模型(RX是有点过分了),那么也许尝试TPL数据流BroadcastBlock<T>。广播被命名为电视广播 - 如果一帧没有被“处理”的速度不够快,它将被丢弃,因此处理与“现场”帧保持相关。

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

UPDATE:ReplaySubject重播第一X,它不是一个FIFO队列是 '第一X列表'。