异步函数返回Task(Of String)还是String?

时间:2014-12-19 17:51:38

标签: .net vb.net task-parallel-library async-await

我正在学习TAP,我想知道.NET的哪个特性允许将此方法中的result隐式地转换为或解释为Task(Of String)

Public Async Function CheckHostInstructionAsync() As Task(Of String)
    Dim result As String
    result = Await pipeReader.ReadLineAsync() 'pipeReader is a System.IO.StreamReader
    If (result.Equals("exit", StringComparison.InvariantCultureIgnoreCase)) Then terminate = True
    Return result
End Function

首先,如果Await pipeReader.ReadLineAsync()“返回”Task(Of String),为什么我可以将其分配给result,它被声明为字符串?

其次,虽然返回类型为Return result,但为什么我可以说Task(Of String)

3 个答案:

答案 0 :(得分:4)

密钥位于Async/Await个关键字中。

Async告诉编译器你会假装你正在返回一个string,并且它需要处理你所处的事实的复杂性实际上返回一个最终会产生字符串的Task。

Await只能在Async方法中使用,并告诉编译器下一个表达式将返回产生某些内容的Task,并且编译器需要解决假设在此之后其余代码被赋予该任务将返回的事物(在这种情况下为String)的复杂性。

答案 1 :(得分:2)

该功能是TAP本身(基于任务的异步模式)或async-await,因为它主要被称为。 async关键字告诉编译器生成状态机,因此您可以使用await。它还会生成Task(带结果值,如果有的话)或方法运行时可能出现的任何异常。

在您的情况下,pipeReader.ReadLineAsync()会返回Task(Of String),而不仅仅是StringAwait使您能够提取"

完成任务后的实际结果。

当你自己返回result时,编译器知道生成一个Task(Of String),当等待时会产生String(或异常,如果有的话)

答案 2 :(得分:0)

对于您的第一个问题,Await pipeReader.ReadLineAsync()不返回Task<string>,而是pipeReader.ReadLineAsync()方法本身。有await编辑后,您将获得执行结果。

其次,由于Task<string>装饰,返回应该返回async的方法的字符串,这表示编译器会为您进行此转换。