[英]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.