【问题标题】:Async function returning Task(Of String) or String?异步函数返回任务(字符串)或字符串?
【发布时间】:2015-02-18 16:50:42
【问题描述】:

我正在学习TAP,我想知道.NET 的哪些功能允许将此方法中的result 隐式转换为Task(Of String) 或解释为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,它被声明为一个String?

第二,为什么我可以说Return result,虽然返回类型是Task(Of String)

【问题讨论】:

  • @I3arnon -- 我删除了你的 VB.NET 标签。我的示例在 VB.NET 中,但我的问题同样适用于 C#(或任何其他 CLR 语言)。
  • 没关系。标签不会限制曝光,它会扩展它。大多数 .Net 问题与语言无关,但它们仍被标记为所使用的语言。
  • @I3arnon -- 明白了。我加回来了。那么为什么 SO 将其限制为最多 5 个标签呢?
  • 这是meta的问题,但5个可能就足够了。

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


【解决方案1】:

对于您的第一个问题,不是Await pipeReader.ReadLineAsync() 返回Task<string>,而是pipeReader.ReadLineAsync() 方法本身。拥有它awaited,你会得到执行的结果。

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

【讨论】:

    【解决方案2】:

    关键在Async/Await关键字中。

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

    Await 只能在Async 方法中使用,它告诉编译器下一个表达式将返回一个产生某些东西的Task,编译器需要解决假装的复杂性在这一点之后的其余代码给出了任务将返回的东西(在这种情况下为String)。

    【讨论】:

      【解决方案3】:

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

      在您的情况下,pipeReader.ReadLineAsync() 返回一个Task(Of String) 而不仅仅是StringAwait 使您能够在该任务完成后从该任务中“提取”实际结果。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多