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

问题描述

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

解决方法

BlockingCollection 中添加项目可能会阻塞,以防集合有界,并且其内部缓冲区当前已满。这就是 TryAdd 方法存在的原因,它从不阻塞,而是在这种情况下返回 false(不添加项目)。 AddToAny 方法最初尝试查找无界集合,然后调用 TryAdd 到该集合。 Source code

/// <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)到该集合更快。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...