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)
队列。主要是我很好奇是否有人对这种设计的可能原理有任何见解。
永远不要根据调试会话做出任何结论,先检查源代码。
的 class 信息
public IEnumerable<T> Queue { get { return _sourceDebuggingInformation.OutputQueue; } }
如您所见,此处的 Queue
属性 来自 调试信息 字段。
我们来看看 class:
internal IEnumerable<TOutput> OutputQueue { get { return _source._messages.ToList(); } }
再次,如您所见,这是不是基于列表的队列,它是为了调试而转换为列表的队列。
最后,让我们看看什么类型有_messages
字段。它是 SingleProducerSingleConsumerQueue<T>
,它应该如何工作。
显示的调试会话来自 How to: Implement a Producer-Consumer Dataflow Pattern 上提供的示例程序。
在System.Threading.Tasks.Dataflow中,为什么像BufferBlock这样的标准块类型是用List而不是Queue来实现的?大多数数据流块(尤其是 BufferBlock<T>
)旨在用作 FIFO,但弹出列表的头部是 O(n)
而不是 O(1)
队列。主要是我很好奇是否有人对这种设计的可能原理有任何见解。
永远不要根据调试会话做出任何结论,先检查源代码。
的 class 信息public IEnumerable<T> Queue { get { return _sourceDebuggingInformation.OutputQueue; } }
如您所见,此处的 Queue
属性 来自 调试信息 字段。
我们来看看 class:
internal IEnumerable<TOutput> OutputQueue { get { return _source._messages.ToList(); } }
再次,如您所见,这是不是基于列表的队列,它是为了调试而转换为列表的队列。
最后,让我们看看什么类型有_messages
字段。它是 SingleProducerSingleConsumerQueue<T>
,它应该如何工作。