C#5 异步返回类型 - 澄清?

Posted

技术标签:

【中文标题】C#5 异步返回类型 - 澄清?【英文标题】:C#5 async return types -clarification? 【发布时间】:2013-07-13 18:11:43 【问题描述】:

来自here :

异步方法可以返回Task<T>Taskvoid。 为什么返回Task<T>Task?因为它们是可等待的,而 void 是 不是。因此,如果您有一个返回 Task<T>Task 的异步方法,那么 您可以将结果传递给 await。

现在考虑这个例子:

/*1*/    public async Task<int> CalculateAnswer()
/*2*/       
/*3*/         await Task.Delay(100); 
/*4*/        
/*5*/         // Return a type of "int", not "Task<int>"
/*6*/         return 42;
/*7*/       

明白当控件进入async方法并遇到await操作符的那一刻,它首先检查awaitable是否已经完成,如果已经完成则正常运行(同步)。 如果没有,则从 async 方法返回。

好的,所以它返回了,我们需要密切关注异步任务。我想这就是为什么我们在方法签名处有Task&lt;T&gt;

问题

但是为什么我在 Task&lt;int&gt; 中需要 intawaitable 与 INT 没有任何关系(!)!——它可能是一个下载某些东西的网络服务。为了密切关注异步操作,我只能使用Task

所以 要么 Task&lt;t&gt; 是用来监视 async 操作 OR(!!!) 是用来指示返回值方法?

我很困惑。 :-(

【问题讨论】:

【参考方案1】:

本例中有两个任务。

CalculateAnswer 返回的任务是Task&lt;int&gt;。它表示方法CalculateAnswer。该任务将在CalculateAnswer 完成时完成,其结果(int)将是该方法的返回值。

另一个任务是Task.Delay 返回的任务。那个只是Task;没有结果值。该任务代表延迟。

【讨论】:

so Task&lt;int&gt; 与异步操作本身无关? await没关系,没有。

以上是关于C#5 异步返回类型 - 澄清?的主要内容,如果未能解决你的问题,请参考以下文章

C#5.0异步

MvvmCross ViewModel启动方法异步行为澄清

异步的返回类型

使用 ReadFile 异步读取管道

C#异步方法async/await的三种返回类型

C# 8中的Async Streams