Async hive mind: 考虑一下这个
private static async Task A()
{
await DelayOneSecond();
await DelayOneSecond();
await DelayOneSecond();
}
private static async Task B()
{
await Task.WhenAll(DelayOneSecond(), DelayOneSecond(), DelayOneSecond());
}
private static Task DelayOneSecond() => Task.Delay(1000);
首先完成哪种方法? A,B还是同时?
同时运行它们的代码丢失了,但想象一下就是那里。
我原来的回答是,await不是一个阻塞操作,基于这个类似的答案here,这两个相似,减去了WhenAll一次传播所有异常,使得更容易不丢失异常的差异。如果其中一个方法抛出异常,则AllAll不会立即返回。
但后来我被告知答案是B,B将首先完成,因为它并行运行。 A将一个接一个地运行它们,等待每个完成,然后再继续下一个。 我还被告知:Await是非阻塞的,它将控制权交给调用者,方法的其余部分设置为延续,因此执行直到等待的调用完成之后。
我一直试图找到有关此行为的更多信息,因为我假设多次等待将以相同的方式工作。有人可以对答案给出更多解释
答案 0 :(得分:1)
由于A
方法有3个连续的await
语句,第二个延迟必须等到第一个,第三个必须等到第二个,它将需要 at至少 3秒执行A()
。 (顺序方法)
B
方法可以在不同的线程中调度Task
,因此每个方法都不必等待其他线程。这将花费至少一秒,并且可能花费不到3秒。