C#5.0のasync/awaitに関してtask.Start()を実行した後のawait task; の挙動がよくわからない
C#5.0のasync/awaitを学習しています。
下記のコンソールアプリケーションが期待した動作と異なる動きをします。
理由を教えていただけないでしょうか。
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);
}
}
期待する出力
1. elapsed=0
2. elapsed=1
3. elapsed=1
4. elapsed=2
5. elapsed=2
実際の出力
Visual Studio 2015 Community で実行しました。
1. elapsed=0
2. elapsed=1
3. elapsed=1
5. elapsed=1
4. elapsed=2
※4と5が期待とは逆
※5の出力が期待より1秒早い。