System.Threading.Tasks.Dataflow: Почему стандартные типы блоков реализованы с помощью List, а не Queue? - PullRequest
0 голосов
/ 24 октября 2018

enter image description here

Показанный сеанс отладки взят из примера программы, предоставленной в Как: реализовать шаблон потока данных производителя-потребителя .

В System.Threading.Tasks.Dataflow, почему стандартные типы блоков, такие как BufferBlock, реализованы с использованием списка, а не очереди?Большинство блоков потока данных (особенно BufferBlock<T>) предназначены для использования в качестве FIFO, но для заголовка списка отображается O(n), а не O(1) для очереди.В основном мне любопытно, есть ли у кого-нибудь понимание возможного обоснования этого дизайна.

1 Ответ

0 голосов
/ 25 октября 2018

Никогда не делайте никаких выводов на основе сеанса отладки, сначала изучите источник.

Рассмотрите информацию о классе для BufferBlock<T>

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

Как видитесвойство Queue, полученное здесь из поля отладочной информации .

Давайте еще раз посмотрим на этот класс :

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

СноваКак видите, это , а не очередь на основе списка, это очередь, преобразуемая в список для отладки .

Наконец, давайте посмотрим, какой тип имеет_messages поле.Это SingleProducerSingleConsumerQueue<T>, который работает именно так, как и должен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...