【问题标题】:Execute Async methods in parallel using Task.WhenAll使用 Task.WhenAll 并行执行异步方法
【发布时间】:2020-10-25 02:01:14
【问题描述】:

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

【问题讨论】:

  • InsertData 是否返回 Task
  • 是的。 InsertData 返回 Task 和 GetData() 方法返回 Task>
  • 您希望通过尝试并行执行多个插入得到什么?这只会增加竞争。 Task.WhenAll 也不并行化任何东西,它等待已经执行的异步方法完成。 您的代码使用await this.service.GetData1()等强制串行执行

标签: parallel-processing async-await task


【解决方案1】:

您可以将您对 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));

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2021-03-06
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    相关资源
    最近更新 更多