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
调用语句类似于:
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(of string)”类型的值无法转换为字符串。
目标是让GUI反应更顺畅。在网络访问(计时器)期间,Gui有时没有响应。 使用.net 4.5
答案 0 :(得分:0)
您必须Await
该方法或对其.Result
获取值,否则您只需返回Task
,这就是您的错误所抱怨的内容。< / p>
您已将Query
函数设计为异步,因此无法继续执行代码,因为您不知道获取结果需要多长时间。因此,它会为您提供Task(Of String)
后退,最终会为您提供结果。
如果您想立即使用,可以访问Result
属性。这将使代码停止,直到Task完成并返回String,这不是你想要的(这不是异步的)。
由于您希望保持UI线程的响应性,您可以使用Await
暂停代码但保留线程处理消息(以便您的UI响应)。您必须将其他方法标记为Async
才能使其生效。
Dim theString As String = Await Query(...)
答案 1 :(得分:0)
错误:“system.threading.tasks.task(of string)”类型的值无法转换为字符串。
您收到此错误,因为async方法的输出是一项任务。您需要通过在返回的任务上调用.Result属性来访问结果。在上面共享的代码片段中,JObject.parse需要一个字符串,而是传递一个任务。
所以你必须将上面的代码改为:JObject.Parse(WebApi.Query(queryStr).Result)。
关于指示GUID没有响应的第二部分,可能是由于阻塞UI线程导致的死锁。如果你不小心,你可能会破坏你的用户界面。我不知道您的具体情况,但最好查看以下文章。
Stephen Toub撰写了一篇很好的文章,详细解释了这一点 - http://blogs.msdn.com/b/pfxteam/archive/2011/01/13/10115163.aspx