2013-01-10 21 views
2

当我打电话IProducerConsumerCollection<T>.TryAdd(<T>)IProducerConsumerCollection<T>.TryTake(out <T>)这些会因为另一个线程正在使用集合而失败吗?IProducerConsumerCollection <T> .TryAdd/.TryTake - 它们何时返回true/false?

或者在这种情况下,即使在另一个线程完成集合之后,如果有空间来添加或采取某些操作,它总是会返回true?

没有,我可以在这里看到:http://msdn.microsoft.com/en-us/library/dd287147.aspx

回答

4

虽然理论上集合可以拒绝起飞/添加请求,以任何理由,我知道有关的唯一原因是Add失败,因为收集已达到其容量,和Take失败,因为集合是空的。

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

+0

要在上面一点点扩大:使用'IProducerConsumerCollection 最突出的情况下'是'BlockingCollection ',它使用的超时_only_为等待收集到足够的空间(对于'TryAdd目的()')或有一个元素(用于'TryTake()')。争用的处理与用户指定的超时无关。见例如http://referencesource.microsoft.com/#System/sys/system/collections/concurrent/BlockingCollection.cs,b4de4389b8938c7e –

+0

既然'BlockingCollection '没有实现接口,这不是完全确定的,但它显示了如何微软希望这些方法得以实施。接口本身不支持超时(所以超时显然不会影响成功/失败),甚至在'BlockingCollection '中的非接口实现中,超时只与集合的完全/空状态有关,如非超时的情况下,没有别的。 –

0

例如,BlockingCollection <T>其是高级抽象通过接口(它不实现尽管接口)与边界和阻断能力可能会引发以下之一:

  • 的ObjectDisposedExceptionTryAdd(T)TryTa ke(T)一旦收集处置。
  • 出现InvalidOperationException上TryAdd(T),如果它标志着作为除完整。当你向2个生产者添加一个集合的值时,考虑一下情况,一个标记集合完成,另一个尝试添加到集合中。
相关问题