5

有谁知道,在 C# BlockingCollection<> 上进行迭代时,是否从集合中获取元素,就像 BlockingCollection.Take() 一样?

BlockingCollection<int> q = new BlockingCollection<int>();
[...]
foreach(int i in q)
{
    //does q still contain i?
}

谢谢

编辑:当然我的意思是 BlockingCollection,但出于某种原因,我想到了 BlockingQueue 并使用了它。

4

3 回答 3

13

枚举器BlockingCollection<T>不会从集合中删除项目。

但是,从返回的枚举器确实会从集合中删除项目。BlockingCollection<T>.GetConsumingEnumerable()

于 2013-12-06T11:24:38.957 回答
2

foreach简单地枚举集合。它永远不会从任何集合中删除任何内容。

于 2013-12-06T11:19:20.477 回答
0

.NET 库中没有BlockingQueue<T>

假设

  1. 您在谈论BlockingCollection<T>:不,使用 foreach 调用该GetEnumerator方法,该方法返回一个IEnumerator. 简单枚举集合中的元素的标准实现,IEnumerator没有任何可观察到的副作用。由于MSDN没有BlockingCollection<T>具体说明,因此可以安全地假设此特定实现也没有可观察到的副作用。

  2. 你说的是第三方库:你必须检查它的实现,但我认为假设它不会从集合中删除任何东西是安全的。

编辑:实际上,因为BlockingCollection环绕 a IProducerConsumerCollection<T>,所以BlockingCollection使用底层(内部)集合的枚举器。.NET 提供的任何IProducerConsumerCollection<T>实现都不会修改集合。

于 2013-12-06T11:21:02.633 回答