Насколько я знаю, добавление в BlockingCollection не блокирует, o AddToAny, о котором я могу думать, это если некоторые из них вызывают CompleteAdding(). Это единственное использование AddToAny? И как только все они вызовут CompleteAdding, AddToAny всегда будет терпеть неудачу для этого списка объектов BlockingCollection?
Предлагает ли метод BlockingCollection.AddToAny какие-либо преимущества в производительности по сравнению с добавлением в один BlockingCollection?
comment
BlockingCollection: Предоставляет возможности блокировки и ограничения. Как вы думаете, что произойдет, если одна или несколько коллекций в настоящее время заполнены?
- person Damien_The_Unbeliever   schedule 04.02.2021
Ответы (1)
Добавление элемента в BlockingCollection
может блокироваться, если коллекция ограничена, а ее внутренний буфер в настоящее время заполнен. Вот почему TryAdd
существует метод, который никогда не блокируется и вместо этого возвращает false
в этом случае (без добавления элемента). Метод AddToAny
пытается изначально, чтобы найти неограниченную коллекцию, и вызывает TryAdd
для этой коллекции. Исходный код:
/// <summary>
/// Fast path for TryAddToAny to find a non bounded collection and add the items in it
/// </summary>
private static int TryAddToAnyFast(BlockingCollection<T>[] collections, T item)
{
for (int i = 0; i < collections.Length; i++)
{
if (collections[i].m_freeNodes == null)
{
collections[i].TryAdd(item);
return i;
}
}
return -1;
}
Следовательно, использование AddToAny
с одной неограниченной коллекцией приведет к дополнительной работе и увеличению накладных расходов, поэтому это не может быть быстрее, чем прямой вызов Add
(или TryAdd
) для этой коллекции.
person
Theodor Zoulias
schedule
04.02.2021