首页 > 解决方案 > 与添加到单个 BlockingCollection 相比,BlockingCollection.AddToAny 方法是否提供任何性能优势?

问题描述

据我所知,添加到 BlockingCollection 不会阻塞,我能想到的 AddToAny 是如果其中一些调用 CompleteAdding()。这是 AddToAny 的唯一用途吗?一旦他们都调用 CompleteAdding,对于这个 BlockingCollection 对象列表,AddToAny 总是会失败?

标签: c#concurrencythread-safetyblockingcollection

解决方案


BlockingCollection如果集合是有界的,并且其内部缓冲区当前已满,则在 can 块中添加项目。这就是该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)该集合更快。


推荐阅读