.net-4.0 - ConcurrentBag<T> 的实际用途是什么?

标签 .net-4.0 task-parallel-library

ConcurrentBag 将允许多个线程从包中添加和删除项目。一个线程可能会将一个项目添加到包中,然后最终将相同的项目取出。它说 ConcurrentBag 是无序的,但它有多无序?在单个线程上,包就像一个堆栈。无序是否意味着“不像链表”?

ConcurrentBag 的实际用途是什么?

最佳答案

因为没有排序,ConcurrentBag 比 ConcurrentStack/Queue 具有性能优势。它由 Microsoft 实现为本地线程存储。因此,每个添加项目的线程都在其自己的空间中执行此操作。检索项目时,它们来自本地存储。只有当它为空时,线程才会从另一个线程存储中窃取项目。因此,ConcurrentBag 不是一个简单的列表,而是一个分布式的项目列表。并且几乎是无锁的,应该在高并发下更好地扩展。

不幸的是,在 .NET 4.0 中存在性能问题(在 4.5 中已修复),请参阅
http://ayende.com/blog/156097/the-high-cost-of-concurrentbag-in-net-4-0

关于.net-4.0 - ConcurrentBag<T> 的实际用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6447290/

相关文章:

c# - 实现返回任务的方法时的契约(Contract)约定

c# - 如何在 .net 3.5 中获得 Task<T> 的等价物?

C# 从内部代码事件 WF 4.0 以编程方式终止工作流

visual-studio-2008 - 我可以在Visual Studio 2008中使用.NET 4.0 beta吗?

linq-to-sql - 从LINQ到SQL到Entity Framework 4.0的迁移-技巧,文档等

c# - Console Application 输入参数-字符串识别

c# - 如何知道任务是否同步完成?

c# - TPL DataFlow 无法处理 ActionBlock 中的异常

c# - 取消 token 在这里有什么用

collections - 迭代 ConcurrentQueue<T>