0

我找不到 PostAsync 的完整示例,所以我不得不拼凑起来。因此,我不确定我正在查看的内容是调试器的限制还是我做错了。

这就是我想要做的:

我必须浏览一个列表并为列表中的每个项目进行 Web 服务调用。我的想法是我可以使用新的 4.5 异步内容来保持它在每次调用 Web 服务期间保持流畅而不会阻塞。

我做了一些研究,并在 TekPub 上观看了 Jon Skeet 的视频,但我仍然不确定我是否正确地这样做了。也就是说,当我设置断点时,我的异步方法永远不会将控制权返回给调用者。它基本上似乎与我的同步版本完全一致。

问题:

调试器出现同步是否正常,或者这是否表明我的代码未正确实现?

这是我的 Post 方法:

Public Async Function PostSecureXMLAsync(ByVal username As String, ByVal password As String, ByVal XMLtoSend As String) As Task(Of String)

    Dim content = New StringContent(XMLtoSend, Encoding.UTF8, "text/xml")

    Dim credentials = New NetworkCredential(username, password)
    Dim handler = New HttpClientHandler() With {.Credentials = credentials}

    Using client = New HttpClient(handler)

        Using response = client.PostAsync(APIurl, content).Result
            Return Await response.Content.ReadAsStringAsync()
        End Using

    End Using

End Function

这是它的使用方式:

For Each ListItem In ListObj
...
Result = XMLExchangeObj.PostSecureXMLAsync(Username, Password, Payload).Result
...
Next

我期待控制在等待来自 Web 服务的回复时返回到 For Each 循环,但根据我的断点,它似乎是同步运行的。

4

1 回答 1

0

当您使用 时Async,您不想调用WaitResult。相反,您应该使用Await. 我看到Result一个PostSecureXMLAsync

Using client = New HttpClient(handler)
    Using response = Await client.PostAsync(APIurl, content) ' Changed to Await
        Return Await response.Content.ReadAsStringAsync()
    End Using
End Using

Async当你调用你的方法时还有另一个:

Result = Await XMLExchangeObj.PostSecureXMLAsync(Username, Password, Payload)

这确实意味着您的调用方法也必须是Async,这意味着调用方法的任何方法都应该使用Await,并且还必须是Async,等等。通过您的代码的这种“增长”是完全正常的。允许Async增长,直到达到自然停止点(通常是事件处理程序,您可以制作Async Sub)。

于 2013-07-11T10:10:25.780 回答