为什么异步函数返回System.Threading.Tasks.Task`1 [System.String]?

时间:2016-10-27 18:13:28

标签: vb.net winforms async-await

我有一个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()

但是在文本框中我得到了上面的文字。感谢。

2 个答案:

答案 0 :(得分:4)

我来自C#但应该也一样。在较新的.Net版本(> = 4.5)中实现async / await。因此,如果某个方法被标记为async并返回一个Task(应该始终如此),则需要等待它。这意味着您必须将Method标记为异步。所以你的电话应该是这样的:

txtIDDoc_Detail.Text = await ApiData.GetIdDoc();

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

答案 1 :(得分:0)

@Sebi在这种情况下提供了一个很好的解释,说明如何正确使用asyncawait,但我将完全扩展为什么你得到了结果你看到了。

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

正在回归

  

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

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

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

txtIDDoc_Detail.Text = await ApiData.GetIdDoc() 

或者这个(同步通话):

txtIDDoc_Detail.Text = ApiData.GetIdDoc().Result 

这些调用中的任何一个都会在任务完成后实际产生结果。