You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:54:03