如何并行执行RestApi HttpClient调用:等待一个结果其余预加载
优化并行API调用的实现方案
问题背景
需要并行执行三个REST API调用:
GetCountries:必须等待返回结果,用于当前页面展示GetSomeOtherData和GetSomethingElse:无需等待返回,需预加载到内存并缓存1分钟,供后续页面使用
当前写法:
_ = Task.Run(async () => { await GetSomeOtherData(); }) _ = Task.Run(async () => { await SomethingElse(); }) var countries=await GetCountries();
优化方案
不需要用Task.Run包装异步API调用(API调用属于IO密集型操作,Task.Run会额外占用线程池线程),直接启动后台任务即可:
// 启动后台预加载任务,不阻塞主流程 _ = PreloadAndCacheDataAsync(); // 等待当前页面需要的核心数据 var countries = await GetCountriesAsync(); // 封装预加载与缓存逻辑,便于维护 async Task PreloadAndCacheDataAsync() { try { // 让两个预加载任务并行执行,提升效率 await Task.WhenAll(GetSomeOtherDataAsync(), GetSomethingElseAsync()); // 执行缓存逻辑,设置1分钟过期时间 // 示例:_memoryCache.Set("OtherData", 预加载结果1, TimeSpan.FromMinutes(1)); // _memoryCache.Set("SomethingElse", 预加载结果2, TimeSpan.FromMinutes(1)); } catch (Exception ex) { // 捕获预加载异常,避免影响主流程 // 示例:_logger.LogError(ex, "预加载后台数据失败"); } }
关键优化点
- 去掉冗余的
Task.Run:IO密集型操作本身是异步的,无需额外放到线程池执行,避免浪费线程资源 - 统一管理后台任务:把两个预加载任务封装到单独方法中,方便统一处理缓存、异常和日志
- 并行执行后台任务:用
Task.WhenAll让两个预加载任务同时发起,比单独启动更高效,也便于统一管控 - 隔离异常影响:在预加载方法内部捕获异常,防止后台任务失败干扰主流程中
GetCountries的执行
内容的提问来源于stack exchange,提问作者developer9969
相关产品推荐
相关产品推荐

