当我调用IProducerConsumerCollection<T>.TryAdd(<T>)
或者IProducerConsumerCollection<T>.TryTake(out <T>)
这些是否会因为另一个线程正在使用该集合而失败?
或者,即使在其他线程完成收集之后,如果有空间可以添加或采取某些东西,它总是会返回 true?
我在这里看不到任何东西:http: //msdn.microsoft.com/en-us/library/dd287147.aspx
当我调用IProducerConsumerCollection<T>.TryAdd(<T>)
或者IProducerConsumerCollection<T>.TryTake(out <T>)
这些是否会因为另一个线程正在使用该集合而失败?
或者,即使在其他线程完成收集之后,如果有空间可以添加或采取某些东西,它总是会返回 true?
我在这里看不到任何东西:http: //msdn.microsoft.com/en-us/library/dd287147.aspx
虽然理论上集合可以出于任何原因拒绝获取/添加请求,但我知道的唯一原因是Add
由于集合已达到其容量而Take
失败,并且由于集合为空而失败。
集合从一开始就设计为可在多个线程中使用 - 因此,如果有剩余项目,即使两个线程Take
同时尝试,它们都应该获得一个项目和一个返回值true
。
例如,BlockingCollection <T
>是对接口的高级抽象(尽管它不实现接口),具有边界和阻塞功能,可能会引发以下情况之一: