28243


C#5.0のasync/awaitを学習しています。

下記のコンソールアプリケーションが期待した動作と異なる動きをします。  
理由を教えていただけないでしょうか。

[code]

    using System;
    using System.Diagnostics;
    using System.Threading.Tasks;
    
    class Program
    {
        static void Main(string[] args)
        {
            TestAsync().Wait();
            Console.ReadKey();
        }
    
        static async Task TestAsync()
        {
            var watch = Stopwatch.StartNew();
    
            var task = new Task(async () =>
                {
                    Console.WriteLine("3. elapsed={0}", watch.ElapsedMilliseconds / 1000);
                    await Task.Delay(TimeSpan.FromSeconds(1));
                    Console.WriteLine("4. elapsed={0}", watch.ElapsedMilliseconds / 1000);
                });
    
            Task.Run(async () =>
                {
                    Console.WriteLine("1. elapsed={0}", watch.ElapsedMilliseconds / 1000);
                    await Task.Delay(TimeSpan.FromSeconds(1));
                    Console.WriteLine("2. elapsed={0}", watch.ElapsedMilliseconds / 1000);
                    task.Start(); // ここでtask処理開始
                });
    
            await task;
    
            Console.WriteLine("5. elapsed={0}", watch.ElapsedMilliseconds / 1000);
        }
    }
    
[/code]

## 期待する出力

[code]

    1. elapsed=0
    2. elapsed=1
    3. elapsed=1
    4. elapsed=2
    5. elapsed=2
    
[/code]

## 実際の出力

Visual Studio 2015 Community で実行しました。

[code]

    1. elapsed=0
    2. elapsed=1
    3. elapsed=1
    5. elapsed=1
    4. elapsed=2
    
[/code]

※4と5が期待とは逆  
※5の出力が期待より1秒早い。


CC BY-SA 3.0
2016-08-13T17:17:39.140
28241
2016-08-13T22:32:53.637
2016-08-13T18:11:06.510
18466
18466
question
c#
C#5.0のasync/awaitに関してtask.Start()を実行した後のawait task; の挙動がよくわからない


`Task.Run`とは異なり`System.Threading.Tasks.Task`のコンストラクターは非同期メソッドに対応していません。このため引数のデリゲートは戻り値のタスクを無視して同期実行され、`Task.Delay`が開始されたタイミングで`task`は完了状態になります。


CC BY-SA 3.0
2016-08-13T22:32:53.637
28243
2016-08-13T22:32:53.637
5750
28241
answer