何时使用 BlockingCollection 以及何时使用 ConcurrentBag 而不是 List

2024-04-30

The “为什么这个 Parallel.ForEach 代码会冻结程序?”问题的接受答案 https://stackoverflow.com/a/8365614/2031316建议将列表用法替换为并发包 http://msdn.microsoft.com/en-us/library/dd381779.aspx在 WPF 应用程序中。

我想了解是否阻塞收集 http://msdn.microsoft.com/en-us/library/dd267312%28v=vs.100%29.aspx在这种情况下可以使用吗?


你确实可以使用BlockingCollection,但这样做绝对没有意义。

首先,请注意BlockingCollection http://msdn.microsoft.com/en-us/library/dd267312%28v=vs.100%29.aspx是一个集合的包装器,它实现了IProducerConsumerCollection<T> http://msdn.microsoft.com/en-us/library/dd287147%28v=vs.100%29.aspx。任何实现该接口的类型都可以用作底层存储:

当您创建一个BlockingCollection<T>对象,您可以指定不 不仅有有限的容量,而且还有要使用的集合类型。为了 例如,您可以指定一个ConcurrentQueue<T>第一个对象, 先出(FIFO)行为,或ConcurrentStack<T>最后的对象 先入先出 (LIFO) 行为。您可以使用任何集合类 实施IProducerConsumerCollection<T>界面。默认 集合类型为BlockingCollection<T> is ConcurrentQueue<T>.

这包括ConcurrentBag<T>,这意味着您可以有一个阻塞并发包。那么普通的有什么区别IProducerConsumerCollection<T>和阻塞集合?的文档BlockingCollection说(强调我的):

BlockingCollection<T>用作包装器IProducerConsumerCollection<T>实例,允许删除尝试 从集合到阻塞,直到数据可被删除。 同样,一个BlockingCollection<T>可以创建为强制执行 允许的数据元素数量上限在里面IProducerConsumerCollection<T> [...]

由于在链接的问题中不需要做这些事情,所以使用BlockingCollection只是添加了一层未使用的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 BlockingCollection 以及何时使用 ConcurrentBag 而不是 List? 的相关文章

  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • WPF水平滚动条不可见

    我在 ScrollViewer 中有一个网格 网格只有一列和许多行 我将控件添加到网格行中 问题是 当我添加控件时 我可以看到 VerticalScrollBar 但尽管我添加了非常宽的控件 但我看不到 Horizo ntalScrollB
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • Control.Focus() 和 FocusManager.SetFocusedElement() 之间的区别

    从字面上看 我想知道这一点 在某些情况下 Focus 看起来比 SetFocusedElement 更好 但另一种情况 则是逆转 所以我必须知道那里有什么不同的东西 另外 根据 MSDN Focus 用于键盘焦点 SetFocusedEle
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐