ActionBlockT

(的 foreach)

可以将此类逻辑地视为要处理的数据的缓冲区,以及用于处理该数据的任务,其中数据流块管理这两者。在最基本的用法中,我们可以实例化一个 ActionBlock 并向其发布数据; ActionBlock 构造中提供的委托将针对发布的每个数据异步执行。

StackOverflow 文档

同步计算

var ab = new ActionBlock<TInput>(i => 
{
    Compute(i);
});
…
ab.Post(1);
ab.Post(2);
ab.Post(3);

将异步下载限制为最多 5 个

var downloader = new ActionBlock<string>(async url =>
{
    byte [] imageData = await DownloadAsync(url);
    Process(imageData);
}, new DataflowBlockOptions { MaxDegreeOfParallelism = 5 }); 

downloader.Post("http://website.com/path/to/images");
downloader.Post("http://another-website.com/path/to/images");

Stephen Toub 介绍 TPL 数据流