使用 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);

您可以使用另一种async方法包装对await的调用:

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));

最新更新