背景
C#での非同期処理について理解できず、いろいろとためした結果、個人的に一番理解しやすいと思ったコードの備忘録です。
概要
C#の非同期関数
-
async
キーワードがついた関数が非同期関数。 -
JavaScript
でasync
で宣言された関数がPromise
を返すのと似たように、C#ではTask<T>
を返す - 内部では
await
が必ず使用される。使用されていない場合、async
キーワードがついていても通常の関数として実行される。 -
await
キーワードを付与して実行された非同期処理はTask<T>
が完了するまで待つ。
参考
Taskを利用したコード
List<string> list = new List<string>() { "ABCDEFG", "HI", "JKL" };
List<Task> tasks = new List<Task>();
list.ForEach(str => {
tasks.Add(
Task.Run(async () => {
await Task.Delay(str.Length * 1000);
Console.WriteLine(str);
})
);
});
Task allTask = Task.WhenAll(tasks);
allTask.Wait();
1.複数の非同期タスクを定義
非同期であることがわかりやすいように、List<string> list
内のそれぞれの文字列の長さ*1秒後に文字列を出力するタスクをTask.Run
で作成し、List<Task> tasks
に追加していく。
2.非同期タスクがすべて完了するのを待つ
Task.WhenAll()
の戻り値Task allTask
でWait()
を実行することですべての非同期タスクが完了するのを待つ
結果
Result
HI
JKL
ABCDEFG
実際に実行した結果、一番時間がかかる"ABCDEFG"の出力までの約7秒ですべてのタスクが完了していることがわかった。