我有一个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()
但是在文本框中我得到了上面的文字。感谢。
答案 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)
async
和await
,但我将完全扩展为什么你得到了结果你看到了。
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
这些调用中的任何一个都会在任务完成后实际产生结果。