Создание потока данных TPL TransformBlock, который преобразует один вход в несколько выходов - PullRequest
0 голосов
/ 19 апреля 2020

Я занимаюсь разработкой проекта на основе шаблона потока данных. Для этого я использую библиотеку TPL Dataflow, из. NET.

Я узнал об этой библиотеке совсем недавно, поэтому я все еще ладья ie с небольшими знаниями. Я пытаюсь построить трубопровод из нескольких блоков. Первый блок начинается со списка интерфейсов конфигурации в его входном стеке. На основе каждого объекта конфигурации этот блок создает объект, который будет загружать список URL-адресов из файла. После загрузки URL я хотел бы поместить каждый из них по отдельности в стек вывода для этого блока.

Моя проблема в том, что я не могу найти способ получить функцию преобразования получить объект ввода и вернуть список выходов, которые будут помещены в стек по отдельности. Я что-то здесь упускаю?

private async Task<Uri> LoadUrl(IUrlLoaderSettings loaderSettings)
{
    IUrlLoader newLoader = CreateSeedLoader(loaderSettings);
    List<Uri> urls = await newLoader.LoadAsync().ConfigureAwait(false);

    foreach (Uri url in urls)
    {
        // each url loaded should be posted on output stack.
    }

        return null;
}

// Url Loader block.
TransformBlock<IUrlLoaderSettings, Uri> loaderBlock = new TransformBlock<IUrlLoaderSettings, Uri>(loaderSettings => LoadUrl(loaderSettings));

В основном я хочу, чтобы входной стек имел объекты конфигурации, каждый объект генерирует список выходных данных. Я не хочу, чтобы этот список помещался непосредственно в стек вывода, потому что я хочу, чтобы следующий блок обрабатывал каждый URL отдельно, а не как блок.

Заранее спасибо!

1 Ответ

1 голос
/ 19 апреля 2020

Вам, вероятно, понадобится TransformManyBlock. Этот блок вызывает Func<TInput, IEnumerable<TOutput>> для каждого входного сигнала, который он получает, и распространяет полученные элементы каждого IEnumerable<TOutput> в отдельности. Блок реализует интерфейс IPropagatorBlock<TInput, TOutput>.

...