当控制到达中的await
语句时Cube3
,Task.Delay()
调用并立即返回一个Task
将在延迟后完成的语句。其余部分CalculateAnswer()
被重构为一个延续,它将在Task
返回的Delay()
完成时运行,并CalculateAnswer()
立即返回一个Task<int>
将在该延续完成时完成的延续。
CallCalculateAnswer()
等待Task<int>
返回的 by CalculateAnswer()
,所以同样的逻辑适用:在await
(即return
语句)之后运行的代码被重构为将在完成时运行的延续Task<int>
,并CallCalculateAnswer()
继续返回它自己的Task<int>
.
StartChain()
但是,不会等待由Task<int>
生成的CallCalculateAnswer()
,因此不会生成延续。相反,它将任务存储到局部变量中并返回。因此,您问题中的橙色箭头是正确的。
请注意,在这种特定情况下,由于没有对Task<int>
返回的 by进行任何操作,CallCalculateAnswer()
并且它仅存储在局部变量中,因此一旦StartChain()
返回,它就会“被遗忘”:任务将在未来某个时间完成(或失败),但它的结果(int
它产生的)将丢失。
更新以下评论:您问题中的粉红色箭头表示您希望StartChain()
阻止,等待返回的任务CallCalculateAnswer()
完成,因为它不是async
也不await
是该任务。这不是发生的事情,因为通常的控制流语义适用:该方法返回了一个任务,因此您获得了对该任务的引用,仅此而已。
如果要StartChain()
阻止,可以对返回的任务使用Task.Wait()、Task<T>.Result
或类似方法CallCalculateAnswer()
。