【问题标题】:System.Threading.Tasks.Dataflow: Why are the standard block types implemented with List rather than Queue?System.Threading.Tasks.Dataflow:为什么标准块类型是用 List 而不是 Queue 实现的?
【发布时间】:2018-10-24 19:59:36
【问题描述】:

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

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

【问题讨论】:

    标签: .net queue generic-list tpl-dataflow


    【解决方案1】:

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

    考虑BufferBlock<T>的类信息

    public IEnumerable<T> Queue { get { return _sourceDebuggingInformation.OutputQueue; } }
    

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

    我们来看看class

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

    再一次,如您所见,这是不是基于列表的队列,它是将队列转换为列表以进行调试

    最后,让我们看看_messages字段是什么类型。它是SingleProducerSingleConsumerQueue&lt;T&gt;,它的工作原理正是它应该的方式。

    【讨论】:

    • 有趣。首先,我听说调试器可能会被强制显示与底层变量不同的类型。学的太多,时间太少:/
    • 它不是强制的,它是一个计算属性,你可以自己做:)如果你想了解一个类的内部,你应该检查调试器中的非公共字段。
    猜你喜欢
    • 2012-06-27
    • 2014-01-13
    • 2015-02-14
    • 2017-10-27
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多