我使用How to: Extend the async Walkthrough by Using Task.WhenAll (C#)开发一个程序,以异步方式独立提交多个数据库查询。该程序工作正常,但有一个我不理解的细微差别,我无法找到解释:
在示例中,方法SumPageSizesAsync
的签名是:
private async Task SumPageSizesAsync()
方法SumPageSizesAsync
的正文未明确返回whenAllTask
对象(即WhenAll
汇总Task
)。为什么方法SumPageSizesAsync
没有明确返回whenAllTask
任务?调用StartButton_Click
的{{1}}中的代码行如何“知道”正在返回哪个任务?
SumPageSizesAsync
答案 0 :(得分:2)
为什么SumPageSizesAsync方法没有显式返回whenAllTask任务?
这不是此方法返回的任务。返回的任务是由编译器创建的任务
遇到await
时,会发生以下情况:
- 如果whenAllTask
已经完成,则继续执行方法的其余部分
- 否则,创建一个Task
来执行以下操作:
1:等待whenAllTask
完成
2:然后执行方法的其余部分
然后立即返回此Task
我一直认为return
语句嵌入在await
中。 "返回一个等待其他任务完成的任务,然后执行该方法的其余部分。"
答案 1 :(得分:0)
我完全同意 @Dennis_E 发布的答案,更多信息也可以在 C#6 in a Nutshell (第600页)中找到。
根据作者的说法,在执行异步功能时,使用任务返回类型。如果方法体没有明确的任务返回,则编译器会创建任务。
此任务随后用于以下目的,
答案 2 :(得分:-1)
它是一个异步void函数,意味着它返回Task。由于已经在内部等待,所以这里没有任何回报。