parallel-processing - 使用 Task.WhenAll 并行执行异步方法
问题描述
我需要使用 InsertData() 将数据插入到我的数据库中。正在使用其他服务获取数据。下面的代码一个接一个地执行。并行执行此操作的最佳方法是什么。
var taskslist = new List<Task>();
taskslist.Add(this.database.InsertData("data1", await this.service.GetData1()));
taskslist.Add(this.database.InsertData("data2", await this.service.GetData2()));
taskslist.Add(this.database.InsertData("data3", await this.service.GetData3()));
await Task.WhenAll(taskslist);
解决方案
您可以将调用包装await
在另一种async
方法中:
async Task GetAndInsert(string key, Func<Task<IList<model>>> getFunc)
=> await database.InsertData(key, await getFunc());
然后每个都可以同时运行:
var taskslist = new List<Task>();
taskslist.Add(GetAndInsert("data1", service.GetData1));
taskslist.Add(GetAndInsert("data2", service.GetData2));
taskslist.Add(GetAndInsert("data3", service.GetData3));
await Task.WhenAll(taskslist);
如果您不需要在Tasks
完成后使用它们,您甚至可以将它们直接传递给Task.WhenAll
而不是创建列表:
await Task.WhenAll(
GetAndInsert("data1", service.GetData1),
GetAndInsert("data2", service.GetData2),
GetAndInsert("data3", service.GetData3));
推荐阅读
- c# - Winforms:迭代同一列的excel行时出错
- node.js - 如何将外部 API 响应保存到 Firebase
- node.js - 在 Live 服务器上托管我的 node.js 项目
- apache-kafka-streams - 如何避免从变更日志主题中提取时间戳以触发 Processor::punctuate
- angular - ionic 3 - 如何从相机插件 getPicture 方法触发“选择文件”
- python - 将文本拆分为列后仅保留最后一列的最简单方法
- dart - 将文本字段放置在 sliver 中时,键盘无法正确显示
- jquery - 在表单上使用 jQuery 更改操作和数据远程不起作用
- azure - 如何修复 vNet 对等模板
- jquery - Twitter-Typeahead 自动完成功能不起作用?