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

nun*_*unu 14 .net c# parallel-processing multithreading task-parallel-library

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

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

码:

List<Employee> totalEmployees = new List<Employee>();
Run Code Online (Sandbox Code Playgroud)

方法一:

public async Task<IEnumerable<Employee>> SearchEmployeeFromDb();
Run Code Online (Sandbox Code Playgroud)

方法2:

public async Task<IEnumerable<Employee>> GetEmployeeFromService();
Run Code Online (Sandbox Code Playgroud)

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

i3a*_*non 22

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

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

这假设并行意味着同时发生.如果您希望从头开始使用多个线程运行这些操作(包括方法的同步部分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);
}
Run Code Online (Sandbox Code Playgroud)