我正在寻找一个类似于BlockingCollection的集合对象,这将让我有多个消费者。但是,我需要那些多个消费者来消费所有项目。他们无法从中删除项目。基本上,我需要能够从另一个线程向它添加项目,并期望任何获得Enumerator的人滚动浏览所有已添加的项目。并阻止它关闭。
在任何地方都有这样的集合类型吗?
[编辑] 好主,猜猜我会澄清...... BlockingCollection.GetConsumingEnumerable()返回在项目不可用时或者在调用CompleteAdding之前阻止枚举的枚举。我想要相同的东西,除了不从集合中删除项目。
[编辑] 好的。随你。我解决了这个问题:编写自己的阻止列表。
答案 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
支持的集合)。