管理大量异步操作的并发执行通常需要任务限制。 任务并行库 (TPL) 数据流为这一常见挑战提供了一个优雅的解决方案。
TPL Dataflow 的 TransformBlock<TInput, TOutput>
提供了一个强大的机制来控制并行任务执行的最大级别。 这使您可以有效地处理数据流(如 URL)并在处理完成后收集结果。
这是一个实际的实现示例:
<code class="language-csharp">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 }</code>
此代码创建一个 TransformBlock
(名为 downloader
),将并发下载限制为 50。downloader
链接到 BufferBlock
(buffer
) 以保存 HttpResponse
对象。 提交所有 URL 后,我们发出完成信号并等待 downloader
完成。 最后,从 buffer
.
TPL Dataflow 比手动节流方法具有显着优势:
值得注意的是,TransformBlock
缓冲输入和输出。 为了防止潜在的死锁,请将其链接到单独的 BufferBlock
,如上所示,并建议在完成后检索结果。
以上是TPL数据流如何简化异步任务限制?的详细内容。更多信息请关注PHP中文网其他相关文章!