2つのタスクの結果を1つのリストコレクションにまとめたいと思います。
確認してください-両方のメソッドを並行して実行したいです。
List<Employee> totalEmployees = new List<Employee>();
方法1:
public async Task<IEnumerable<Employee>> SearchEmployeeFromDb();
方法2:
public async Task<IEnumerable<Employee>> GetEmployeeFromService();
ここで、これら2つのメソッドの結果をtotalEmployees
フィールドに保持したいと思います。また、これら2つのメソッドは非同期で実行する必要があります。
多くの答えが近いですが、最もクリーンで最も効率的なオプションは、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);
...または、2つのリストをマージする方法を使用します。
ソリューションを更新しました。リストを作成してから最初の結果を追加する必要はありませんでした。最初のメソッドが終了するのを待ってから、リストを作成します。