是否等待(并行)处理未等待的任务?

时间:2019-05-22 08:46:32

标签: async-await

直到现在,我习惯await Tasks继续处理之前。 但是现在我准备做一些有意义的事情,而不是等待

您需要等待正常的异步方法,如:

async Task Fasync()
{
    A();
    await OtherAsync();
    B();
}

我确信在AOtherAsync都执行完所有语句之前,不会调用B。我可以肯定,在处理B OtherAsync之前已经达到其后置条件。

我注意到等待之后继续执行的线程通常具有不同的线程ID。我认为这意味着在等待之后,其他线程可以继续处理我的代码。

现在让我们创建一个不等待的函数:

async Task Gasync()
{
    K();
    Task taskF = Fasync(); // call Fasync defined above. Do not await yet
    L();
    await taskF;           // await until Fasync completed
    M();
}

书面诊断消息告诉我,该过程是按以下顺序调用的:

K()
within Fasync(): A(), OtherAsync()
L()

因此,Gasync仅在Fasync开始等待后才继续处理。 L在A返回之前没有启动。

作为Fasync的用户,我正式地只能依靠Fasync的前提条件和后置条件。关于Fasync如何达到其发布后的条件,我可能不会做任何假设。对于Fasync的工作顺序,我可能不会承担任何责任。

这使Fasync的设计师可以自由地更改其程序,而不必担心调用者所做的假设,只要他满足适当的后置条件即可。

只是出于好奇:
如果线程X正在处理L并且OtherAsync完成,会发生什么?

  • 线程X是否继续处理L,而同时另一个线程Y通过处理Fasync继续M
  • Gasync处理是否已暂停,直到Fasync完成?
  • 在Gasync等待Fasync之前,是否暂停处理Fasync?

0 个答案:

没有答案