2014-03-26 64 views
0
Public Shared Async Function Query(url As String) As Task(Of String) 
     Dim clnt As New HttpClient 
     Dim StringResult As String = Await clnt.GetStringAsync(url) 
     Return StringResult 
    End Function 

調用語句超出函數返回的字符串是這樣的:HOWTO讓從HttpClient的GetStringAsync(URL)

Function Gettopic(pair As BPair) As topic  
    Dim queryStr As String = String.Format("https://ssss.com/topic", BPairHelper.ToString(pair)) 

    Return topic.ReadFromJObject(TryCast(JObject.Parse(WebApi.Query(queryStr)) 
     ("topic"), JObject))  
End Function 

錯誤:類型(串)system.threading.tasks.task的」值不能轉換後的字符串。

目標是使GUI反應更流暢。在網絡接入(定時器)桂是在時刻不響應。 使用.NET 4.5

回答

0

您必須Await方法或者做.Result就可以得到它的值,否則你只會得到Task,這就是你的錯誤所抱怨的。

您已將Query函數設計爲異步函數,因此您無法繼續執行代碼,因爲您不知道獲取結果需要多長時間。因此它給你一個Task(Of String)回來,最終會給你結果。

如果你想要它,你可以訪問Result屬性。這將使你的代碼停止,直到任務完成並返回字符串,這不是你想要的(這不是異步的)。

既然你想保持你的UI線程響應,你可以使用Await暫停你的代碼,但保持線程處理消息(所以你的UI是響應)。您必須將其他方法標記爲Async才能生效。

Dim theString As String = Await Query(...)

0

錯誤:類型(字符串)system.threading.tasks.task的」值不能在字符串被轉換

您收到此錯誤,因爲異步方法的輸出是一個任務,你需要通過調用返回的任務。結果屬性來訪問的結果。在上面JObject.parse共享的代碼片段需要一個字符串,而是一個任務傳遞。

所以,你就必須改變上述代碼如下:JObject.Parse(WebApi.Query(queryStr).Result)。

關於您指出GUID沒有響應的第二部分,可能是因爲阻塞了UI線程而導致死鎖。如果你不小心,你可能會使你的用戶界面陷入僵局。我不知道你的具體情況,但最好查看下面的文章。

有由Stephen Toub的好文章,說明此項詳情 - http://blogs.msdn.com/b/pfxteam/archive/2011/01/13/10115163.aspx

+0

是的,。結果導致完全阻斷GUI。我沒有重寫調用語句並使其異步的技能/能力。 –