プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

続 非同期処理の戻り値をまとめて待ちたい

昨日の続きです。

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で定義を見てみたら・・・

f:id:puni-o:20160218105543p:plain

すぐ下にあった!!

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をスペースに変換していないとエラーで見れなかったけどそれもなおってるし