0

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

哪里有这样的集合类型?

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

[编辑] 好的。任何。我解决了这个问题:通过编写我自己的阻止列表。

4

1 回答 1

1

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

您可以直接使用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)。

于 2013-02-01T07:13:13.397 回答