3

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

谢谢

4

1 回答 1

3

它可以(请参阅如何:从 BlockingCollection 中单独添加和获取项目

第一个示例显示如何添加和获取项目,以便在集合暂时为空(获取时)或达到最大容量(添加时)或指定的超时期限已过时,操作将阻塞。请注意,仅在使用构造函数中指定的最大容量创建 BlockingCollection 时才启用最大容量阻塞。

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

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

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