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), если он помечен как завершенный для добавления. Подумайте о ситуации, когда вы добавляете значения в коллекцию от двух производителей: один отмечает коллекцию как завершенную, а другой пытается добавить ее в коллекцию.