c# - 与添加到单个 BlockingCollection 相比,BlockingCollection.AddToAny 方法是否提供任何性能优势?
问题描述
据我所知,添加到 BlockingCollection 不会阻塞,我能想到的 AddToAny 是如果其中一些调用 CompleteAdding()。这是 AddToAny 的唯一用途吗?一旦他们都调用 CompleteAdding,对于这个 BlockingCollection 对象列表,AddToAny 总是会失败?
解决方案
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
)该集合更快。
推荐阅读
- c - 如果字符串数组在 C 中以 null 结尾,为什么其他数据类型的数组不以 null 结尾?
- linux - Bash 脚本在杀死自己的 PGID 及其所有子进程后没有被杀死
- c# - 获取外部 API url 上可用的端点列表
- reactjs - 如何将数据传递到另一个文件?
- html - 如何使用 VBA 和按钮的详细信息单击网站的按钮
- google-maps - Flutter:带有图像叠加的地图
- c# - 是否有与“aws s3 ls [my_bucket]”等效的 C# 代码?
- javascript - 如何使用带别名的输入掩码插件
- c++ - 如何正确转换欧拉角并乘以四元数?
- for-loop - Shiny 服务器中的 For 循环:如何在每次按下 ActionButton 时不覆盖值?