根据建议,使用TPL Dataflow。
TransformBlock<TInput, TOutput>您可能正在寻找A。
您定义一个
MaxDegreeOfParallelism来限制可以并行转换多少个字符串(即可以下载多少个url)。然后,您将URL发布到该块,完成后,您告诉该块您已完成添加项目,并获取了响应。
var downloader = new TransformBlock<string, HttpResponse>( url => Download(url), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 } );var buffer = new BufferBlock<HttpResponse>();downloader.linkTo(buffer);foreach(var url in urls) downloader.Post(url); //or await downloader.SendAsync(url);downloader.Complete();await downloader.Completion;IList<HttpResponse> responses;if (buffer.TryReceiveAll(out responses)){ //process responses}注意:
TransformBlock缓冲区同时缓冲其输入和输出。那么,为什么我们需要将其链接到
BufferBlock?
因为在
TransformBlock所有项目(
HttpResponse)被消耗完之后才能完成,并且
awaitdownloader.Completion将挂起。取而代之的是,我们将其
downloader所有输出转发到专用的缓冲块-
然后我们等待
downloader完成,然后检查缓冲块。



