首页 > 解决方案 > 使用 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);

标签: parallel-processingasync-awaittask

解决方案


您可以将调用包装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));

推荐阅读