首页 > 解决方案 > Have lots of Async calls, how to make it faster?

问题描述

I have a API call, inside the API call, it has lots of async calls. the code looks like:

.....
var getFeaturedTask = await _listingProxy.GetFeaturedListingsAsync(request);
var getRentalTask = await _listingProxy.GetRentalsAsync(request);
var getContactTask = await _contactProxy.GetLeadContactAsync(request);
var getSignTask = await _signProxy.GetListingSignsAsync(request);
var getTextTask = await _signProxy.GetTextCodeForListingAsync(request);
......

There are more than 20 tasks. I'm wondering whether there is a way to make this part of the code run faster. For example, should I use below code and it will be faster?

var getFeaturedTask = _listingProxy.GetFeaturedListingsAsync(request);
var getRentalTask = _listingProxy.GetRentalsAsync(request);
var getContactTask = _contactProxy.GetLeadContactAsync(request);
var getSignTask = _signProxy.GetListingSignsAsync(request);
......
Task.WaitAll(new Task[] { getFeaturedTask, getRentalTask, getContactTask, getSignTask, ... });

Any other possibilities? Or, no matter what, the time we may save is very small, not worth it?

Thanks

标签: c#.net

解决方案


WhenAll是进行异步并发的适当方法:

var getFeaturedTask = _listingProxy.GetFeaturedListingsAsync(request);
var getRentalTask = _listingProxy.GetRentalsAsync(request);
var getContactTask = _contactProxy.GetLeadContactAsync(request);
var getSignTask = _signProxy.GetListingSignsAsync(request);
......
await Task.WhenAll(getFeaturedTask, getRentalTask, getContactTask, getSignTask, ...);

此代码块将同时运行所有异步请求。如果它们是真正的异步操作(即,不使用异步签名阻塞),并且它们花费的时间足够长以WhenAll克服(小)额外开销,并且没有额外的节流系统(即,如果代理只允许每个 IP 一次请求一个请求或类似的东西),那么这个块应该运行得更快。


推荐阅读