2014-03-26 35 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。我没有重写调用语句并使其异步的技能/能力。 –