C# 添加项目时BlockingCollection是否会阻止?为什么会这样?

C# 添加项目时BlockingCollection是否会阻止?为什么会这样?,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,我们正在使用Parallel.foreach来使用阻塞集合中的项。我知道在默认情况下,分区是在完成此操作时发生的。我想进一步了解这如何影响BlockingCollection上的锁/阻塞。当线程正在使用时,是否存在阻塞集合上的添加操作可能被阻塞的情况 谢谢可以(见) 第一个示例显示了如何添加和获取项,以便在集合暂时为空(获取时)或处于最大容量(添加时)或指定的超时时间已过时,操作将被阻止。请注意,只有在使用构造函数中指定的最大容量创建BlockingCollection时,才会启用最大容量阻塞

我们正在使用Parallel.foreach来使用阻塞集合中的项。我知道在默认情况下,分区是在完成此操作时发生的。我想进一步了解这如何影响BlockingCollection上的锁/阻塞。当线程正在使用时,是否存在阻塞集合上的添加操作可能被阻塞的情况

谢谢

可以(见)

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

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

如果在foreach循环中使用项目,则在此期间添加项目不会受阻,但有几件事需要注意:

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

  • 谢谢..我知道这些场景可能会阻塞。我更关心的是中间…集合没有指定最大容量。我认为在这种情况下,它不应该阻止添加。也就是说,我想知道Parallel.ForEach执行的分区是否会导致阻塞。我不认为它会阻塞,但在执行时有几件事需要注意。查看我的更新我认为将
    BlockingCollection
    ConcurrentQueue
    (默认情况下使用)一起使用确实可以保证顺序。您的意思是在
    ForEach()
    中使用
    GetConsumingEnumerable()