C#中如何实现带返回值的async/await并行执行?
C# 独立异步操作并行执行方案
问题场景
你当前的写法是串行await两个独立的服务调用,第一个调用执行完成才会启动第二个调用,总执行时长约为6秒。两个调用无依赖关系的前提下,可以通过异步并行将总耗时压缩到3秒左右。
实现方法
核心逻辑是先启动所有异步任务,再统一等待执行结果,不要启动一个任务就立刻await。
示例代码如下:
// 先启动两个服务调用任务,此时两个请求已经并行发出 var propertiesTask = _propertyService.GetPropertiesAsync("Fairfax, VA"); var ratingsTask = _ratingsService.GetRatingsAsync(12549); // 等待任务执行完成后获取结果 var properties = await propertiesTask; var ratings = await ratingsTask;
如果需要统一等待所有任务完成再处理结果,也可以使用Task.WhenAll的写法,更适合多任务场景:
var propertiesTask = _propertyService.GetPropertiesAsync("Fairfax, VA"); var ratingsTask = _ratingsService.GetRatingsAsync(12549); // 等待所有任务执行完成 await Task.WhenAll(propertiesTask, ratingsTask); // 直接读取结果,不会产生阻塞 var properties = propertiesTask.Result; var ratings = ratingsTask.Result;
注意事项
- 该方案仅适用于互相没有依赖关系的IO密集型异步操作,你当前的两个独立服务调用完全符合适用条件
- 不要为了并行使用
Task.Run包装同步服务方法,这种属于线程并行,针对IO密集型场景会额外浪费线程资源,无法获得最优性能 - 如需处理任务异常,可以单独捕获每个任务的异常,也可以捕获
Task.WhenAll抛出的AggregateException批量处理所有子任务的异常
内容的提问来源于stack exchange,提问作者BuddyJoe
相关产品推荐
相关产品推荐

