はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】LINQで非同期処理をawaitをする

はじめに

今回はLINQで非同期処理をawaitする方法について紹介したいと思います。

コード

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をつけてあげることで全ての非同期処理が終わるまで待ってくれるというわけですね。

さいごに

UniRxやUniTaskの作者でも有名な方のブログにてかなり細かく説明されていました。
neue.cc

もっと詳しく知りたい方は是非。