问题描述
据我所知,添加到 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
)到该集合更快。