使用缓冲区和缓存进行并发收集

时间:2013-02-01 07:09:35

标签: .net concurrency blockingcollection

我正在寻找一个类似于BlockingCollection的集合对象,这将让我有多个消费者。但是,我需要那些多个消费者来消费所有项目。他们无法从中删除项目。基本上,我需要能够从另一个线程向它添加项目,并期望任何获得Enumerator的人滚动浏览所有已添加的项目。并阻止它关闭。

在任何地方都有这样的集合类型吗?

[编辑] 好主,猜猜我会澄清...... BlockingCollection.GetConsumingEnumerable()返回在项目不可用时或者在调用CompleteAdding之前阻止枚举的枚举。我想要相同的东西,除了不从集合中删除项目。

[编辑] 好的。随你。我解决了这个问题:编写自己的阻止列表。

1 个答案:

答案 0 :(得分:1)

  

基本上,我需要能够从另一个线程向它添加项目   并期望任何获得枚举器的人滚动浏览所有人   已添加的项目。

您可以直接使用BlockingCollection<T>,但请确保“使用者”只列举集合本身而不是GetConsumingEnumerable()的结果。

来自MSDN

  

与GetConsumingEnumerable不同,   BlockingCollection.IEnumerable.GetEnumerator返回一个标准   不修改基础集合的枚举器。

var collection = new BlockingCollection<int> { 5, 12, 20 };

//5, 12, 20
foreach (var i in collection)
{
    Console.WriteLine(i);
}

collection.Add(6);

// 5, 12, 20, 6
foreach (var i in collection)
{
    Console.WriteLine(i);
}
  

阻止直到它关闭。

你的意思是你想在集合上有一个开放的枚举器时阻止添加项目吗?为什么?当然这是可行的(例如由ReaderWriterLockSlim支持的集合)。