ハードルが高くてチュートリアルできない。入門者お断りの玄人ドキュメント……。
成果物
情報源
- https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/generate-consume-asynchronous-stream
- https://ufcpp.net/study/csharp/async/asyncstream/
- https://qiita.com/muniel/items/d91cd61b912e4c2938a9
- Task
公式が難しすぎるので別サイトを参考にした。
公式のチュートリアルが難しい理由
- 非同期プログラミング自体が難しい
- C#における非同期プログラミング(Thread, Task)
- これまでの歴史を知らねばわからない
- 重いリポジトリからコード例を入手せねばならない
- 動作にはgitとGitHubのアカウントとアクセストークンが必要
- C#学習するためにそれらの環境を用意せねばならない
- 学習に関係ない多数の仕事を強いられる
- 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;
が必要。同じじゃない。結構ちがう。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- SQLite 3.29.0 ※
- C# dotnet 3.0.100
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux