IProducerConsumerCollection<T>.TryAdd /.TryTake - когда они возвращают true/false?

Когда я звоню IProducerConsumerCollection<T>.TryAdd(<T>) или же IProducerConsumerCollection<T>.TryTake(out <T>) они когда-нибудь потерпят неудачу, потому что другой поток использует коллекцию?

Или это тот случай, когда есть место для добавления или что-то, что нужно взять, даже после того, как другой поток завершил сбор, он всегда будет возвращать true?

Ничего, что я могу увидеть здесь: http://msdn.microsoft.com/en-us/library/dd287147.aspx

2 ответа

Хотя теоретически коллекции могут отклонять запросы на получение / добавление по любой причине, единственная причина , о которой я знаю, это Add сбой, потому что коллекция достигла своей емкости, и Take сбой, потому что коллекция пуста.

Коллекции разрабатываются с самого начала для использования из нескольких потоков - так что если остаются элементы, даже если два потока пытаются Take в то же время они должны получить элемент и возвращаемое значение true,

Например, BlockingCollection<T > который представляет собой высокоуровневую абстракцию интерфейса (хотя он и не реализует интерфейс) с ограничивающими и блокирующими возможностями, может вызвать одно из следующих действий:

  • ObjectDisposedException для TryAdd(T) или TryTake(T) после удаления коллекции.
  • InvalidOperationException в TryAdd(T), если он помечен как завершенный для добавления. Подумайте о ситуации, когда вы добавляете значения в коллекцию от двух производителей: один отмечает коллекцию как завершенную, а другой пытается добавить ее в коллекцию.
Другие вопросы по тегам