.net 具有缓冲区和缓存的并发收集

.net 具有缓冲区和缓存的并发收集,.net,concurrency,blockingcollection,.net,Concurrency,Blockingcollection,我正在寻找一个类似于BlockingCollection的集合对象,它可以让我拥有多个消费者。但是,我需要这些多个消费者来消费所有商品。他们无法从中删除项目。本质上,我需要能够从另一个线程向其中添加项目,并希望任何获得枚举器的人都能滚动浏览所有添加的项目。封锁,直到它关闭 任何地方都有这样的集合类型吗 [编辑] 天哪,我想我会澄清。。。GetConsumingEnumerable()返回当项不可用时或在调用CompleteAdding之前阻止枚举的可枚举项。我想要同样的东西,除了不从集合中删除项

我正在寻找一个类似于BlockingCollection的集合对象,它可以让我拥有多个消费者。但是,我需要这些多个消费者来消费所有商品。他们无法从中删除项目。本质上,我需要能够从另一个线程向其中添加项目,并希望任何获得枚举器的人都能滚动浏览所有添加的项目。封锁,直到它关闭

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

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

[编辑] 可以无论什么我解决了这个问题:通过编写自己的阻止列表

本质上,我需要能够从另一个线程向其中添加项目 并期望任何获得枚举器的人都能滚动浏览所有 曾经添加的项目

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

发件人:

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

var collection=newblockingcollection{5,12,20};
//5, 12, 20
foreach(集合中的变量i)
{
控制台写入线(i);
}
增加(6);
// 5, 12, 20, 6
foreach(集合中的变量i)
{
控制台写入线(i);
}
封锁,直到它关闭


您的意思是要阻止在集合上存在打开的枚举数时添加项吗?为什么?这当然是可行的(例如,由
ReaderWriterLockSlim
支持的集合)。

因此需要缓冲所有创建的项目?如果没有。Take()则项目仍然存在。您可以编写一个实现BlockingCollection和take away take()的自定义集合。@JonSkeet Yes。基本上,我正在从网络中输入一些结果,并期望用户获得多个枚举数,就像它是一个“真实”的枚举数一样。然而,他可能会获得多个。-1要求澄清“封锁直至关闭”。响应“与BlockingCollection的操作完全相同”。但您要求“我还希望所有枚举数都阻止,直到集合关闭”。这不是阻塞集合的工作方式。我澄清了这一点。我想。我没想到这个问题这么难理解。它会一直停到关门吗?我的印象是,当没有更多的记录可用时,标准枚举器就退出了。你的例子正好符合我的要求,除了我还希望所有的枚举数都被阻止,直到集合关闭。该页面上的示例中隐藏着这样的文本:前者将阻止等待完成,而后者将简单地对基础集合的当前状态进行快照。“我想阻止消费者。”芥末澄清了这个问题。定义block直到关闭。@完全按照BlockingCollection的操作进行责备。
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);
}