创建将单个输入转换为多个输出的 TPL 数据流转换块

Creating a TPL Dataflow TransformBlock that transforms single input into multiple outputs

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

最近才知道这个库,还是菜鸟一知半解。 我正在尝试构建一个包含多个块的管道。第一个块以其输入堆栈上的配置接口列表开始。基于每个配置对象,此块创建一个将从文件加载 URL 列表的对象。加载 URL 之后,我想将它们中的每一个单独放置在该块的输出堆栈上。

我的问题是我似乎无法找到让转换函数接收输入对象和 return 将单独放置在堆栈中的输出列表的方法。我在这里遗漏了什么吗?

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,而不是作为一个块。

提前致谢!

您可能需要 TransformManyBlock。此块为其接收的每个输入调用 Func<TInput, IEnumerable<TOutput>>,并单独传播每个 IEnumerable<TOutput> 的生成项。该块实现了 IPropagatorBlock<TInput, TOutput> 接口。