2016-10-27 41 views
0

我有如下一個VB.NET功能:爲什麼Async函數返回System.Threading.Tasks.Task`1 [System.String]?

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 

我試圖從數據庫返回的文件編號,但我發現

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

實際上它應該返回「2」。請幫助我:這個功能我做錯了什麼?

更新

這裏是調用的函數:

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

但文本框內,我發現了上面的文字。謝謝。

+0

請編輯您的問題,以顯示函數調用的代碼。 –

+0

請檢查我更新的問題。謝謝。 – barsan

+0

您應該將'GetIdDoc'重命名爲'GetIdDocAsync',以遵循一般推薦的異步方法模式。 –

回答

3

我來自C#,但應該工作一樣。在較新的.Net版本(> = 4.5)中實現異步/等待。所以如果一個方法被標記爲async並返回一個Task(應該總是這樣),你需要等待它。這意味着你必須將你的方法標記爲異步。所以,你的電話應該是這樣的:

txtIDDoc_Detail.Text = await ApiData.GetIdDoc(); 

的等待等待,直到長時間運行的任務已就緒,並返回它的內在價值。所有的異步方法應該返回任務。如果該方法是無效的,它將是任務。否則它可能是Task<int>或任何其他類型。所以,等待它,你可以保持運行;)

+0

@Nkosi謝謝。編輯。 – Sebi

+0

或'txtIDDoc_Detail.Text = ApiData.GetIdDoc.Result',如果你想同步運行它(無論什麼原因)。 –

+0

@BradleyUffner - 'ApiData.GetIdDoc.Result'可能導致死鎖。 – Fabio

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 

它要麼完成後,將在任務的實際結果。

+0

'ApiData.GetIdDoc()。結果''可能導致死鎖,請檢查以獲取更多信息:[不要在異步代碼上阻止](http://blog.stephencleary.com/2012/ 07/dont-block-on-async-code.html) – Fabio

+0

這將導致死鎖,如果GetIdDoc();方法在MainThread中返回一個結果。因爲方法想在Result嘗試訪問它時返回它。 – Sebi

+0

感謝您解釋我的問題。 – barsan

相關問題