続 非同期処理の戻り値をまとめて待ちたい
昨日の続きです。
var numbers = new[] { 2, 4, 6, 9 }; var resultList = new List<bool>(); foreach (var task in numbers.Select(IsEven).ToArray()) { resultList.Add(await task); } Console.WriteLine($"Even {resultList.Count(r => r)}, Odd {resultList.Count(r => !r)}");
が美しくなかったんで頑張んばりました。
Task.WaitAllの存在は知っていたのですがこれは戻り値が無いTask用で、なんでTask<Result>は対応してないんだよー、とVisual Studioで定義を見てみたら・・・
すぐ下にあった!!
Visual Studioの定義を表示が便利すぎる!*1
言い訳ですがWhenAnyの存在もしっていたんですよ。んでこれじゃないってんでWhenの文字列は完全にスルーしてました。
ということで修正。
var numbers = new[] { 2, 4, 6, 9 }; var result = await Task.WhenAll(numbers.Select(IsEven)); Console.WriteLine($"Even {result.Count(r => r)}, Odd {result.Count(r => !r)}");
すっきりしました。
一つ賢くなったぞ!
いらないと思うけど、コードすべてを置いておきます。
class Program { static void Main(string[] args) { Task.Run(async () => { var numbers = new[] { 2, 4, 6, 9 }; var result = await Task.WhenAll(numbers.Select(IsEven)); Console.WriteLine($"Even {result.Count(r => r)}, Odd {result.Count(r => !r)}"); }); Console.ReadKey(); } static async Task<bool> IsEven(int num) { await Task.Delay(5000); return num % 2 == 0; } }
*1:一時期Tabをスペースに変換していないとエラーで見れなかったけどそれもなおってるし