LoginSignup
4
2

More than 3 years have passed since last update.

C#のTaskの動きを理解するために

Last updated at Posted at 2020-11-20

背景

C#での非同期処理について理解できず、いろいろとためした結果、個人的に一番理解しやすいと思ったコードの備忘録です。

概要

C#の非同期関数

  • asyncキーワードがついた関数が非同期関数。
  • JavaScriptasyncで宣言された関数がPromiseを返すのと似たように、C#ではTask<T>を返す
  • 内部ではawaitが必ず使用される。使用されていない場合、asyncキーワードがついていても通常の関数として実行される。
  • awaitキーワードを付与して実行された非同期処理はTask<T>が完了するまで待つ。

参考

Task.Run メソッド

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 allTaskWait()を実行することですべての非同期タスクが完了するのを待つ

結果

Result
HI
JKL
ABCDEFG

実際に実行した結果、一番時間がかかる"ABCDEFG"の出力までの約7秒ですべてのタスクが完了していることがわかった。

スクリーンショット 2020-11-20 161853.png

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2