3

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

或者,即使在其他线程完成收集之后,如果有空间可以添加或采取某些东西,它总是会返回 true?

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

4

2 回答 2

6

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

集合从一开始就设计为可在多个线程中使用 - 因此,如果有剩余项目,即使两个线程Take同时尝试,它们都应该获得一个项目和一个返回值true

于 2013-01-10T11:33:28.493 回答
0

例如,BlockingCollection <T>是对接口的高级抽象(尽管它不实现接口),具有边界和阻塞功能,可能会引发以下情况之一:

  • 释放集合后, TryAdd( T)或TryTake(T)出现ObjectDisposedException
  • 如果将TryAdd(T)标记为添加完成,则出现InvalidOperationException。考虑一下当您从 2 个生产者向集合添加值时的情况,一个将集合标记为完成,然后另一个尝试添加到集合。
于 2013-01-10T11:51:04.010 回答