Async和await:为什么签名定义了Task的返回类型的异步方法没有显式返回Task?

时间:2018-03-25 12:50:04

标签: c# async-await task

我使用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

3 个答案:

答案 0 :(得分:2)

  

为什么SumPageSizesAsync方法没有显式返回whenAllTask​​任务?

这不是此方法返回的任务。返回的任务是由编译器创建的任务 遇到await时,会发生以下情况:
- 如果whenAllTask已经完成,则继续执行方法的其余部分 - 否则,创建一个Task来执行以下操作:
1:等待whenAllTask完成 2:然后执行方法的其余部分 然后立即返回此Task 我一直认为return语句嵌入在await中。 "返回一个等待其他任务完成的任务,然后执行该方法的其余部分。"

答案 1 :(得分:0)

我完全同意 @Dennis_E 发布的答案,更多信息也可以在 C#6 in a Nutshell (第600页)中找到。

根据作者的说法,在执行异步功能时,使用任务返回类型。如果方法体没有明确的任务返回,则编译器会创建任务

此任务随后用于以下目的,

  1. 单一完成方法。
  2. 异步调用链。

答案 2 :(得分:-1)

它是一个异步void函数,意味着它返回Task。由于已经在内部等待,所以这里没有任何回报。