コード
using System; using System.Linq; using System.Threading.Tasks; class Program { private static void Main(string[] args) { _ = Calculate(); Console.ReadLine(); } private static async Task Calculate() { var nums = new[] { 1, 2, 3, 4, 5, 6 }; // 各要素に対して非同期で処理を行い、その全ての処理が終るまで待つ var ans = await Task.WhenAll(nums.Select(async x => await AddAsync(x))); foreach (var item in ans) Console.WriteLine(item); } private static Task<int> AddAsync(int x) => Task.Run(() => x + 1); }
注目する箇所はこの箇所です。
// 各要素に対して非同期で処理を行い、その全ての処理が終るまで待つ
var ans = await Task.WhenAll(nums.Select(async x => await AddAsync(x)));
nums.Select(async x => await AddAsync(x))
の返り値はIEnumerable<Task<int>
になるので、await Task.WhenAll
をつけてあげることで全ての非同期処理が終わるまで待ってくれるというわけですね。