(SelectMany,1-m:此映射的结果被“展平”,就像LINQ的SelectMany一样)
TransformManyBlock <TInput,TOutput>与TransformBlock <TInput,TOutput>非常相似。
关键区别在于,虽然TransformBlock <TInput,TOutput>为每个输入生成一个且只有一个输出,但是TransformManyBlock <TInput,TOutput>为每个输入生成任意数量(零个或多个)的输出。与ActionBlock和TransformBlock <TInput,TOutput>一样,可以使用委托来指定此处理,用于同步和异步处理。
Func <TInput,IEnumerable>用于同步,而Func <TInput,Task <IEnumerable >>用于异步。与ActionBlock和TransformBlock <TInput,TOutput>一样,TransformManyBlock <TInput,TOutput>默认为顺序处理,但可以进行其他配置。
映射委托重新调整项目的集合,这些项目分别插入到输出缓冲区中。
异步网络爬虫
var downloader = new TransformManyBlock<string, string>(async url => { Console.WriteLine(“Downloading “ + url); try { return ParseLinks(await DownloadContents(url)); } catch{} return Enumerable.Empty<string>(); }); downloader.LinkTo(downloader);
将可枚举扩展为其组成元素
var expanded = new TransformManyBlock<T[], T>(array => array);
从1到0或1元素进行过滤
public IPropagatorBlock<T> CreateFilteredBuffer<T>(Predicate<T> filter) { return new TransformManyBlock<T, T>(item => filter(item) ? new [] { item } : Enumerable.Empty<T>()); }
TPL数据流简介,作者:Stephen Toub