异步方法和竞争条件

时间:2017-10-13 13:32:22

标签: c# .net asynchronous async-await

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是非阻塞的,它将控制权交给调用者,方法的其余部分设置为延续,因此执行直到等待的调用完成之后。

我一直试图找到有关此行为的更多信息,因为我假设多次等待将以相同的方式工作。有人可以对答案给出更多解释

1 个答案:

答案 0 :(得分:1)

由于A方法有3个连续的await语句,第二个延迟必须等到第一个,第三个必须等到第二个,它将需要 at至少 3秒执行A()。 (顺序方法)

B方法可以在不同的线程中调度Task,因此每个方法都不必等待其他线程。这将花费至少一秒,并且可能花费不到3秒。