我正在学习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)
。
答案 0 :(得分:4)
密钥位于Async/Await个关键字中。
Async
告诉编译器你会假装你正在返回一个string
,并且它需要处理你所处的事实的复杂性实际上返回一个最终会产生字符串的Task。
Await
只能在Async
方法中使用,并告诉编译器下一个表达式将返回产生某些内容的Task
,并且编译器需要解决假设在此之后其余代码被赋予该任务将返回的事物(在这种情况下为String
)的复杂性。
答案 1 :(得分:2)
该功能是TAP本身(基于任务的异步模式)或async-await
,因为它主要被称为。 async
关键字告诉编译器生成状态机,因此您可以使用await
。它还会生成Task
(带结果值,如果有的话)或方法运行时可能出现的任何异常。
在您的情况下,pipeReader.ReadLineAsync()
会返回Task(Of String)
,而不仅仅是String
。 Await
使您能够提取"
当你自己返回result
时,编译器知道生成一个Task(Of String)
,当等待时会产生String
(或异常,如果有的话)
答案 2 :(得分:0)
对于您的第一个问题,Await pipeReader.ReadLineAsync()
不返回Task<string>
,而是pipeReader.ReadLineAsync()
方法本身。有await
编辑后,您将获得执行结果。
其次,由于Task<string>
装饰,返回应该返回async
的方法的字符串,这表示编译器会为您进行此转换。