質問編集履歴

1 タイトル修正

ElecDove

ElecDove score 259

2019/02/04 19:10  投稿

C# Taskについてawaitの有無の違い
C# Taskについてawait task.WhenAll()のとき,awaitの有無の違い
ひとつ前の質問は解決したのですが(↓),Taskを待機するときのawaitの有無による動作の違いについて教えてください.
[Teratail:C#で並列処理,すべて終わるまで待機](https://teratail.com/questions/172565)
どちらも以下のコードを実行した場合の実行結果は同じ(に見える)のですが,13目のawaitの有無,foreach内のresultの違いによりどのような違いが生じるのでしょうか.
どちらも以下のコードを実行した場合の実行結果は同じ(に見える)のですが,13目のawaitの有無,foreach内のresultの違いによりどのような違いが生じるのでしょうか.
よろしくお願いします.
コード1
```C#
static void Main() {
           fuga2();
           Console.ReadLine();
       }
       static async void fuga2() {
           Console.WriteLine("fuga start");
           var tasks = new List<Task<int>>();
           tasks.Add(Task.Run(() => Heavy("1")));
           tasks.Add(Task.Run(() => Heavy("2")));
           var result = await Task.WhenAll(tasks.ToArray());
           foreach (var r in result) {
               Console.WriteLine(r);
           }
       }
       static int Heavy(string str) {
           Console.WriteLine(str + "Start");
           for (int i = 0; i < 200000000; i++) ;//重たい処理
           Console.WriteLine(str + "End");
           return 5; //ダミーデータ
       }
```
コード2
```C#
static void Main() {
           fuga2();
           Console.ReadLine();
       }
       static async void fuga2() {
           Console.WriteLine("fuga start");
           var tasks = new List<Task<int>>();
           tasks.Add(Task.Run(() => Heavy("1")));
           tasks.Add(Task.Run(() => Heavy("2")));
           var result = Task.WhenAll(tasks.ToArray()); //←awaitがない
           foreach (var r in result.Result) {          //←resultがresult.Resultになっている
               Console.WriteLine(r);
           }
       }
       static int Heavy(string str) {
           Console.WriteLine(str + "Start");
           for (int i = 0; i < 200000000; i++) ;//重たい処理
           Console.WriteLine(str + "End");
           return 5; //ダミーデータ
       }
```
```
fuga start
2Start
1Start
//ここで数秒待たされる
2End
1End
5
5
```
  • C#

    16460 questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る