【问题标题】:Creating a TPL Dataflow TransformBlock that transforms single input into multiple outputs创建将单个输入转换为多个输出的 TPL 数据流 TransformBlock
【发布时间】:2020-04-19 15:13:13
【问题描述】:

我正在开发一个基于数据流模式的项目。为此,我正在使用来自 .NET 的 TPL Dataflow 库。

我最近才知道这个库,所以我还是个新手,知识很少。 我正在尝试构建几个块的管道。第一个块以其输入堆栈上的配置接口列表开始。基于每个配置对象,此块创建一个对象,该对象将从文件中加载 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,而不是作为一个块。

提前致谢!

【问题讨论】:

    标签: c# .net web-scraping tpl-dataflow


    【解决方案1】:

    您可能需要TransformManyBlock。此块为其接收的每个输入调用Func&lt;TInput, IEnumerable&lt;TOutput&gt;&gt;,并分别传播每个IEnumerable&lt;TOutput&gt; 的生成项。该块实现了IPropagatorBlock&lt;TInput, TOutput&gt; 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2021-05-20
      • 2023-03-23
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多