Поток данных TPL выбирает блок для размещения в нем элемента

Пожалуйста, взгляните на мою схему сети TPL Dataflow ниже. Есть список URL-адресов, несколько блоков загрузки и блок разбора. Блоки загрузки загружают HTML-страницы с разных прокси-серверов, и все они связаны с блоком Parse, где происходит работа, связанная с процессором. Если при загрузке страницы произошло исключение, URL добавляется обратно в список.

Выкладываю ссылки на блоки загрузки с самодельным циклом (на фото). Мой вопрос: есть ли какой-либо тип блока, который может помочь с выбором блока загрузки для публикации URL-адресов вместо моего цикла ручной работы? Например, он будет публиковать URL-адреса для первых часов загрузки с .InputCount ‹=2.

И еще один. Прокси-сервер может стать недоступным во время выполнения потока данных. Я думаю, что если я размещу BufferBlock вместо списка URL-адресов, то я смогу динамически отвязать LoadBlocks с мертвым прокси от этого BufferBlock, если есть такая возможность. Итак, есть ли способ динамически отключать блоки от сети?

Схема сети потока данных


person AsValeO    schedule 30.04.2014    source источник


Ответы (1)


Есть ли какой-либо тип блока, который может помочь с выбором блока «Загрузить» для публикации URL-адресов вместо моего цикла ручной работы? Например, он будет публиковать URL-адреса для первых часов загрузки с .InputCount ‹=2.

Что вы можете сделать, так это иметь один BufferBlock, связанный со всеми блоками загрузки. Затем вы должны установить BoundedCapacity блоков загрузки на что-то вроде 3 (1 обрабатываемый элемент + 2 в очередях ввода и вывода). При такой настройке элементы будут ожидать в BufferBlock, пока не освободится место в одном из блоков загрузки.

есть ли способ динамически отключать блоки от сети?

Да, LinkTo() возвращает IDisposable, который можно использовать для уничтожения этой ссылки (путем вызова Dispose()).

person svick    schedule 30.04.2014
comment
Большое спасибо, svic! Все работает нормально. Я потратил две недели на отладку этого цикла и теперь заменил его парой строк. - person AsValeO; 01.05.2014
comment
Теперь я не могу понять, как проверить, является ли LinkTo Disposed, похоже, это частная собственность. Мне нужно проверить, не осталось ли здесь живых TransformBlocks. - person AsValeO; 01.05.2014
comment
@ValeO Я думаю, вам придется отслеживать это самостоятельно. Например, если у вас есть коллекция IDisposables, Dispose() удалите ее из коллекции одновременно. - person svick; 01.05.2014