【问题标题】:Why Async function returning System.Threading.Tasks.Task`1[System.String]?为什么异步函数返回 System.Threading.Tasks.Task`1[System.String]?
【发布时间】:2017-03-10 13:06:30
【问题描述】:

我有一个VB.NET函数如下:

Public Shared Async Function GetIdDoc() As Task(Of String)
    Dim result As String = ""
    'Dim Uri As String = "http://localhost:53917/api/Documenti/GetNextIdDocumenti"
    Dim Uri As String = apiUri & ApiEndPoints.GetNextIdDocumenti

    Using client = New HttpClient()
        Using response = Await client.GetAsync(Uri)
            If response.IsSuccessStatusCode Then
                Dim DocumentiIDJsonString = Await response.Content.ReadAsStringAsync()
                result = DocumentiIDJsonString.ToString()

            End If
        End Using
    End Using
    Return result
End Function

我正在尝试从数据库返回文档 ID,但我得到了

System.Threading.Tasks.Task`1[System.String]

实际上它应该返回“2”。请帮帮我:这个功能我做错了什么?

更新

这里是调用的函数:

 txtIDDoc_Detail.Text = ApiData.GetIdDoc().ToString()

但在文本框中,我得到了上面的文本。谢谢。

【问题讨论】:

  • 请编辑您的问题以显示调用该函数的代码。
  • 请检查我更新的问题。谢谢。
  • 您可能应该将 GetIdDoc 重命名为 GetIdDocAsync 以遵循异步方法的普遍推荐模式。

标签: vb.net winforms async-await


【解决方案1】:

@Sebi 很好地解释了在这种情况下如何正确使用 asyncawait,但我将详细说明 为什么 你会得到你看到的结果.

 txtIDDoc_Detail.Text = ApiData.GetIdDoc().ToString()

回来了

System.Threading.Tasks.Task`1[System.String]

因为您在任务实例 Task(Of String) 上调用.ToString,而不是实际结果。不覆盖 .ToString 的类型会继承 Object 的行为,它只是将类型的名称作为字符串返回。

你可能想要这个(异步调用):

txtIDDoc_Detail.Text = await ApiData.GetIdDoc() 

或者这个(同步调用):

txtIDDoc_Detail.Text = ApiData.GetIdDoc().Result 

这些调用中的任何一个实际上都是任务完成后的结果。

【讨论】:

  • ApiData.GetIdDoc().Result 可能会导致死锁,请查看此以获取更多信息:Don't Block on Async Code
  • GetIdDoc(); 会导致死锁方法在 MainThread 中返回结果。因为 Method 想要在 Result 尝试访问它时返回它。
  • 感谢您解释我的问题。
【解决方案2】:

我来自 C#,但应该可以正常工作。在较新的 .Net 版本 (>= 4.5) 中实现了 async/await。所以如果一个方法被标记为异步并返回一个任务(应该总是这样),你需要等待它。这意味着您也必须将您的方法标记为异步。所以你的电话应该是这样的:

txtIDDoc_Detail.Text = await ApiData.GetIdDoc();

await 等待长时间运行的任务准备好并返回它的内部值。所有异步方法都应该返回 Task。如果方法是无效的,它将是任务。否则它可能是Task<int> 或任何其他类型。所以等待它,你可以继续运行;)

【讨论】:

  • @Nkosi 谢谢。已编辑。
  • txtIDDoc_Detail.Text = ApiData.GetIdDoc.Result,如果你想同步运行它(无论出于何种原因)。
  • @BradleyUffner - ApiData.GetIdDoc.Result 会导致死锁。
  • 感谢您的解释和回答
猜你喜欢
  • 2015-07-21
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多