Предлагает ли метод BlockingCollection.AddToAny какие-либо преимущества в производительности по сравнению с добавлением в один BlockingCollection?

Насколько я знаю, добавление в BlockingCollection не блокирует, o AddToAny, о котором я могу думать, это если некоторые из них вызывают CompleteAdding(). Это единственное использование AddToAny? И как только все они вызовут CompleteAdding, AddToAny всегда будет терпеть неудачу для этого списка объектов BlockingCollection?


person ulak blade    schedule 04.02.2021    source источник
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