System.Threading.Tasks.Dataflow: 为什么标准块类型是用 List 而不是 Queue 实现的?

System.Threading.Tasks.Dataflow: Why are the standard block types implemented with List rather than Queue?

显示的调试会话来自 How to: Implement a Producer-Consumer Dataflow Pattern 上提供的示例程序。

在System.Threading.Tasks.Dataflow中,为什么像BufferBlock这样的标准块类型是用List而不是Queue来实现的?大多数数据流块(尤其是 BufferBlock<T>)旨在用作 FIFO,但弹出列表的头部是 O(n) 而不是 O(1) 队列。主要是我很好奇是否有人对这种设计的可能原理有任何见解。

永远不要根据调试会话做出任何结论,先检查源代码。

考虑 BufferBlock<T>

的 class 信息
public IEnumerable<T> Queue { get { return _sourceDebuggingInformation.OutputQueue; } }

如您所见,此处的 Queue 属性 来自 调试信息 字段。

我们来看看 class:

internal IEnumerable<TOutput> OutputQueue { get { return _source._messages.ToList(); } }

再次,如您所见,这是不是基于列表的队列,它是为了调试而转换为列表的队列。

最后,让我们看看什么类型有_messages字段。它是 SingleProducerSingleConsumerQueue<T>,它应该如何工作。