【问题标题】:A Blocking Concurrent Collection - Take method that takes an item that supports a conditionA Blocking Concurrent Collection - Take 方法获取支持条件的项目
【发布时间】:2013-08-15 13:55:20
【问题描述】:

我想要一个支持阻塞线程安全Take操作的并发集合,而实际获取的项目是满足条件的项目。

类似:

private TheBlockingCollection<MyClass> _myCollection;

MyClass myItem = _myCollection.TakeItemWhere(item => item.Type.equals(something));

最终目标是获取集合中当前存在的具有最高属性值的项目。例如- 最大

有这样的内置集合吗?

如果不是,什么是更好的选择?

【问题讨论】:

  • 您是否希望它遍历所有可用的项目,首先取与谓词匹配的那个?还是阻塞直到第一项与谓词匹配?
  • 非常非常怀疑您是否会在现有集合中找到满足该要求的任何内容。听起来您可能希望拥有 多个 集合(每种类型一个)并按优先级对每个集合进行排序。
  • 我会那样做的。但在我的情况下,该属性是一个 int,代表优先级。所以不可能根据值分离到多个集合...
  • 听起来你实际上并不需要这个;听起来你可以让底层集合成为一个优先级队列,为项目提供最高优先级,而无需在获取项目时指定条件。

标签: c# thread-safety concurrent-collections


【解决方案1】:

正如 Servy 在上面的评论中提到的,您应该使用带有 BlockingCollection 的优先级队列。

如果您为存储在集合中的类型实现适当的IComparable&lt;&gt; 接口,那么当您将项目出列时,您将根据您定义的比较接口自动获取第一个项目。

Microsoft have provided a sample ConcurrentPriorityQueue 实现了您可以与 BlockingCollection 一起使用的 IProducerConsumerCollection

首先创建ConcurrentPriorityQueue 的实例,然后使用接受IProducerConsumerCollection&lt;T&gt; 的构造函数之一创建BlockingCollection,例如:http://msdn.microsoft.com/en-us/library/dd287133.aspx

您只需将ConcurrentPriortyQueue 传递给该构造函数。

【讨论】:

  • 听起来不错,我会尽快检查一下
猜你喜欢
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2021-11-18
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多