直到现在,我习惯await
Tasks
继续处理之前。
但是现在我准备做一些有意义的事情,而不是等待
您需要等待正常的异步方法,如:
async Task Fasync()
{
A();
await OtherAsync();
B();
}
我确信在A
和OtherAsync
都执行完所有语句之前,不会调用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完成,会发生什么?
Fasync
继续M
?