创建将单个输入转换为多个输出的 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>
接口。
我正在开发一个基于数据流模式的项目。为此,我正在使用 .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>
接口。