多个异步/等待链接
如何在C#中进行多个异步/等待链接? 例如, 启动几个HTTP请求,然后不要等待所有这些请求,但在每次完成后启动新请求 ?
最简单的方法是编写一个async
方法:
async Task DownloadAndFollowupAsync(...) { await DownloadAsync(); await FollowupAsync(); }
然后您可以使用await Task.WhenAll
:
await Task.WhenAll(DownloadAndFollowupAsync(...), DownloadAndFollowupAsync(...));
如果要对具有有限并行度的项集合执行某些async
操作,那么最简单的方法是使用TPL Dataflow中的ActionBlock
,因为它支持async
委托(与TPL中的大多数其他并行结构不同,如Parallel.ForEach()
)。
var block = new ActionBlock( url => DownloadAsync(url), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = few }); foreach (var url in urls) block.Post(url); block.Complete(); await block.Completion;
您可以将Tasks的ContinueWith扩展方法用于此目的,或者使用Func的扩展,用于返回结果。