やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#チュートリアル(非同期ストリーム。非同期foreach)

 ハードルが高くてチュートリアルできない。入門者お断りの玄人ドキュメント……。

成果物

情報源

 公式が難しすぎるので別サイトを参考にした。

公式のチュートリアルが難しい理由

  • 非同期プログラミング自体が難しい
  • C#における非同期プログラミング(Thread, Task)
    • これまでの歴史を知らねばわからない
  • 重いリポジトリからコード例を入手せねばならない
  • 動作にはgitとGitHubのアカウントとアクセストークンが必要
    • C#学習するためにそれらの環境を用意せねばならない
      • 学習に関係ない多数の仕事を強いられる
  • コードが長い&仕様の理解が必要
    • 非同期プログラミングだけに注目した最小コードにしてほしい
  • 未知の構文
    • 上記とは関係なく、構文だけを先に学習したい
      • 上記を絡めて未知の構文を学習するなど私には不可能
        • 未知の構文にのみ注目した最小コードにしてほしい

厳選

 学習項目が多すぎるので以下に絞り込んだ。

  • 未知の構文
    • async foreach

コード

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        await AsyncForeach(GenerateAsync());
    }
    static async Task AsyncForeach(IAsyncEnumerable<int> items)
    {
        await foreach (var item in items)
        {
            Console.WriteLine(item);
        }
    }
    static async IAsyncEnumerable<int> GenerateAsync()
    {
        for (int i = 0; i<10; i++)
        {
            yield return i;
            await Task.Delay(TimeSpan.FromSeconds(1));
        }
    }
}

出力結果

 以下のように1秒毎に数値が1つずつ出力されていく。

0
1
2
...
9

所感

チュートリアルが難しすぎる

 ただでさえ非同期プログラミングは難しい内容なのに、チュートリアルが無駄に難しくしている感。

 自分用にレベルダウンさせるには、大量にネット検索して読みまくる必要があった。疲れた……。

async/awaitでちょっとハマった

  • Mainの戻り値
    • voidでなくasync Taskでないとダメ

 さもなくば以下のように怒られる。

error CS4033: await' 演算子は、非同期メソッド内でのみ使用できます。このメソッドに 'async' 修飾子を指定し、戻り値の型を 'Task' に変更することを検討してください。

 async/awaitは同期コードとほぼ同じように書けるのがウリだった気がするが。 なんだよasync Taskって。voidとぜんぜん違うじゃん。あと、Taskを使うためにusing System.Threading.Tasks;が必要。同じじゃない。結構ちがう。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux