繁体   English   中英

将两个并行任务的结果合并到一个列表中

[英]Combine the result of two parallel tasks in one list

我想在一个List集合中组合2个任务的结果。

确保 - 我想并行运行这两种方法。

码:

List<Employee> totalEmployees = new List<Employee>();

方法一:

public async Task<IEnumerable<Employee>> SearchEmployeeFromDb();

方法2:

public async Task<IEnumerable<Employee>> GetEmployeeFromService();

现在,我想在totalEmployees字段中totalEmployees这两个方法的结果,这两个方法也应该异步运行。

虽然很多答案都很接近,但最干净,最有效的选择是使用Task.WhenAll结合SelectMany

async Task<IEnumerable<Employee>> Combine()
{
    var results = await Task.WhenAll(SearchEmployeeFromDb(), GetEmployeeFromService());
    return results.SelectMany(result => result);
}

这假设并行意味着同时发生。 如果您希望从头开始使用多个线程运行这些操作(包括async方法的同步部分),您还需要使用Task.Run将工作卸载到ThreadPool线程:

private async Task<IEnumerable<Employee>> Combine()
{
    var results =
        await Task.WhenAll(Task.Run(() => SearchEmployeeFromDb()), Task.Run(() => GetEmployeeFromService()));
    return results.SelectMany(result => result);
}

您可以使用Task.WhenAll创建一个任务,该任务将在所有提供的任务完成时返回

var result = await Task.WhenAll(SearchEmployeeFromDb(),GetEmployeeFromService());
var combined = result[0].Concat(result[1]);
  • 开始这两项任务
  • 使用Task.WhenAll等待两个任务完成
  • 使用Enumerable.Concat组合结果


var searchEmployeesTask = SearchEmployeeFromDb();
var getEmployeesTask = GetEmployeeFromService();

await Task.WhenAll(searchEmployeesTask, getEmployeesTask);

var totalEmployees = searchEmployeesTask.Result.Concat(getEmployeesTask.Result);

这样的事情应该有效:

var t1 = SearchEmployeeFromDb()
var t2 = GetEmployeeFromService()

await Task.WhenAll(t1, t2)

// Now use t1.Result and t2.Result to get `totalEmployees`

使用ConfigureAwait(false)来避免死锁,定义任务,执行然后等待。

var fromDbTask = SearchEmployeeFromDb().ConfigureAwait(false);
var fromServiceTask = GetEmployeeFromService().ConfigureAwait(false);

var fromDbResult = await fromDbTask;
var totalEmployees = new List(fromDbResult);

var fromServiceResult = await fromServiceResult;
totalEmployees.AddRange(fromServiceResult);

...或者使用您想要合并两个列表的方式。

我更新了解决方案,创建列表然后追加第一个结果是不必要的。 我们等待第一种方法完成,然后创建列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM