如何让一个函数从httpclient GetStringAsync(url)返回字符串

时间:2014-03-26 15:56:35

标签: .net vb.net asynchronous httpclient

    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

2 个答案:

答案 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