【发布时间】:2017-10-24 23:35:20
【问题描述】:
我了解当您有任务列表时,建议使用await Task.WhenAll() 而非多个await,因为Task.WhenAll() 处理异常的方式。但是,根据我对“async,await”工作方式的理解,我想知道为什么下面的代码块具有相同的执行时间:
static void Main(string[] args)
{
MainAsync(args).GetAwaiter().GetResult();
Console.ReadLine();
}
static async Task MainAsync(string[] args)
{
Console.WriteLine("Starts :" + DateTime.Now.ToLongTimeString());
var firstTask = SleepForTime(10000);
var secondTask = SleepForTime(7000);
var thirdTask = SleepForTime(5000);
await firstTask;
await secondTask;
await thirdTask;
Console.WriteLine("Done :" + DateTime.Now.ToLongTimeString());
Console.ReadLine();
}
public static async Task SleepForTime(int seconds)
{
await Task.Delay(seconds);
}
这个block需要10秒才能执行,这个也是一样的:
static void Main(string[] args)
{
MainAsync(args).GetAwaiter().GetResult();
Console.ReadLine();
}
static async Task MainAsync(string[] args)
{
Console.WriteLine("Starts :" + DateTime.Now.ToLongTimeString());
var firstTask = SleepForTime(10000);
var secondTask = SleepForTime(7000);
var thirdTask = SleepForTime(5000);
await Task.WhenAll(firstTask, secondTask, thirdTask);
Console.WriteLine("Done :" + DateTime.Now.ToLongTimeString());
Console.ReadLine();
}
public static async Task SleepForTime(int seconds)
{
await Task.Delay(seconds);
}
根据我的理解,第一个块应该需要 22 秒,因为 await 的列表将按顺序执行,因为这是异步的,等待微软在 MSDN 中解释。我在这里缺少什么?是不是对编译器进行了优化?有人可以解释一下引擎盖下发生了什么吗?
【问题讨论】:
标签: c# asynchronous async-await task console-application