在添加项目时BlockingCollection会阻塞吗?为什么如果呢?

时间:2012-06-21 13:19:14

标签: c# .net multithreading task-parallel-library

我们使用Parallel.foreach来使用阻塞集合中的项目。我知道默认情况下分配会在完成后发生。我想更多地了解这可能会如何影响BlockingCollection上的锁定/阻塞。是否有任何情况下,当线程消耗时,阻塞集合上的添加操作可能会被阻止?

感谢

1 个答案:

答案 0 :(得分:3)

它可以(见How to: Add and Take Items Individually from a BlockingCollection

  

第一个示例显示了如何添加和获取项目,以便在集合暂时为空(采用时)或以最大容量(添加时)或指定的超时时间段时,操作将被阻止。请注意,仅当使用构造函数中指定的最大容量创建BlockingCollection时,才会启用阻止最大容量。

因此,如果集合处于最大容量,它将阻止添加。

如果您使用foreach循环中的项目,则在此期间添加项目不会阻止,但您需要注意以下几项:

  1. 无法保证项目的枚举顺序与生产者线程添加的顺序相同。
  2. 重要的是要了解这种枚举(foreach)在精确的时间点表示集合的快照。如果其他线程在执行循环时同时添加或删除项,则循环可能不代表集合的实际状态。