IProducerConsumerCollection <t> .TryAdd / .TryTake - 什么时候返回true / false?</t>

时间:2013-01-10 11:29:59

标签: c# concurrent-collections

当我调用IProducerConsumerCollection<T>.TryAdd(<T>)IProducerConsumerCollection<T>.TryTake(out <T>)时,这些会失败,因为另一个线程正在使用该集合吗?

或者,即使在另一个线程完成了该集合之后,如果还有空间可以添加或者要采取什么,它将始终返回true?

我在这里看不到任何内容:http://msdn.microsoft.com/en-us/library/dd287147.aspx

2 个答案:

答案 0 :(得分:6)

虽然理论上集合可以出于任何原因拒绝接受/添加请求,但我知道的唯一原因是Add失败,因为集合已达到其容量,{{1因为集合是空的而失败。

集合是从一开始就设计的,可以从多个线程中使用 - 所以如果有剩余的项目,即使两个线程同时尝试Take,它们也应该得到一个项目和一个返回值为Take

答案 1 :(得分:0)

例如, BlockingCollection <T&gt; ,这是对接口的高级抽象(虽然它没有实现接口)和阻塞功能可能会引发以下情况之一:

    TryAdd(T) TryTake(T) ObjectDisposedException 处理完毕后,
  • TryAdd(T) 如果标记为已完成添加。考虑从2个生成器向集合添加值时的情况,一个标记集合为完整,另一个标记集合尝试添加到集合。