如何实现C#中多个异步数据库搜索方法的并行执行?
异步并行优化多表搜索功能
当前代码中,多个搜索方法因逐个使用await导致串行执行,无法利用异步并行提升效率。原代码如下:
public async Task<IEnumerable<SearchResponseModel>> Search(string input) { var listOfSearchResponse = new List<SearchResponseModel>(); listOfSearchResponse.AddRange(await SearchOrder(input)), listOfSearchResponse.AddRange(await SearchJob(input)); listOfSearchResponse.AddRange(await SearchClient(input)); listOfSearchResponse.AddRange(await SearchItem(input)); listOfSearchResponse.AddRange(await SearchProduction(input)); return listOfSearchResponse; }
每个搜索方法定义示例:
public async Task<IEnumerable<SearchResponseModel>> SearchOrder(string input) {...}
优化方案:并行执行异步任务
要实现并行,需先启动所有异步任务,再等待全部任务完成后合并结果,修改后的代码如下:
public async Task<IEnumerable<SearchResponseModel>> Search(string input) { // 先启动所有异步搜索任务,不立即等待 var searchTasks = new List<Task<IEnumerable<SearchResponseModel>>> { SearchOrder(input), SearchJob(input), SearchClient(input), SearchItem(input), SearchProduction(input) }; // 等待所有任务并行完成 var results = await Task.WhenAll(searchTasks); // 合并所有结果 var listOfSearchResponse = new List<SearchResponseModel>(); foreach (var result in results) { listOfSearchResponse.AddRange(result); } return listOfSearchResponse; }
关键说明
- 原代码中每次
await都会阻塞当前流程,等待前一个任务完成才会启动下一个搜索方法,因此是串行执行。 - 修改后先将所有搜索任务加入集合,此时任务已开始并行执行,再通过
Task.WhenAll等待所有任务完成,最后统一合并结果,实现真正的异步并行。
内容的提问来源于stack exchange,提问作者Bastien Vandamme
相关产品推荐
相关产品推荐

