2

(我已经阅读了很多关于异步的内容,我想知道如果混合了异步函数调用和非异步会发生什么)并且我在谈论THREAD pov

(我知道不应该混合,但我问是为了更好地理解流程)

假设我有(cube 1)函数调用异步函数,该函数调用异步函数。

(请注意,cube 1 函数不是异步的)

问题:当控制到达(立方体3)时await Task.Delay(100);——

当控件到达cube3 时到底发生了await什么?控件是在粉红色箭头(立方体 1)处返回(并被阻止)还是控件被释放并仍在等待(橙色箭头)

在此处输入图像描述

4

1 回答 1

2

当控制到达中的await语句时Cube3Task.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()

于 2013-07-14T08:17:46.630 回答