有人知道,当迭代C#BlockingCollection<>时,是否从集合中获取元素,就像BlockingCollection.Take()所做的那样?
BlockingCollection<int> q = new BlockingCollection<int>();
[...]
foreach(int i in q)
{
//does q still contain i?
}
由于
编辑:当然我的意思是BlockingCollection,但出于某种原因让我想到了BlockingQueue并使用了它。答案 0 :(得分:11)
BlockingCollection<T>
枚举器不会从集合中删除项目。
但是,从BlockingCollection<T>.GetConsumingEnumerable()
DOES 返回的枚举器会从集合中删除项目。
答案 1 :(得分:2)
foreach
只是枚举整个集合。它永远不会从任何集合中删除任何东西。
答案 2 :(得分:0)
.NET库中没有BlockingQueue<T>
。
假设
您正在谈论BlockingCollection<T>
:否。使用foreach调用GetEnumerator
方法,该方法返回IEnumerator
。 IEnumerator
的标准实现只是枚举集合中的元素而没有任何可观察到的副作用。由于MSDN没有具体说明BlockingCollection<T>
,因此可以安全地假设此具体实施也没有可观察到的副作用。
你在谈论第三方库:你必须检查它的实现,但我认为可以安全地假设它没有从集合中删除任何内容。
修改:实际上,由于BlockingCollection
环绕IProducerConsumerCollection<T>
,BlockingCollection
使用基础(内部)集合的枚举器。 .NET提供的IProducerConsumerCollection<T>
实现都不会修改集合。