我无法找到PostAsync的完整示例,因此我必须将其中一个分段。因此,我不确定我正在查看的是调试器的限制还是我做错了。.Net 4.5等待中断点
这就是我要做的:
我必须要经过一个列表,使Web服务调用的列表上的每个项目。我的想法是,我可以使用新的4.5异步的东西,保持它在每次调用Web服务期间不受阻塞地流动。
我已经完成了研究的基调,并观看了Jon Skeet在TekPub上的视频,但我仍然不确定我是否正确地做了这件事。也就是说,当我设置断点时,我的异步方法永远不会将控制权返回给调用者。它基本上和我的同步版一样。
问:
这是正常的调试器出现同步或这说明什么我的代码不正确实施?
这是帖子的方法:
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
我期待的控制,返回到For Each循环,而这是等待Web服务的回复,但基于我的突破点,它似乎正在同步运行。
这是谜题的一半,因为我的代码不正确。非常感谢您解决它。现在它是正确的,并且将控制权还给了调用者,但它仍然不是我所期望的。它在进入列表中的下一个项目之前等待第一个Web服务调用完成。如果我想让循环同时发出调用,我是否应该使用除async之外的其他功能(例如Parallel.ForEach)?实质上,我想一次性发布所有的Web服务调用,而不是一次一个。 – user2341148
你可以通过调用'PostSecureXMLAsync'并保存任务来启动它们,而不是等待它(你可以通过'For Each'循环来创建一个任务列表,或者使用LINQ'Select'表达)。一旦你有一个任务列表(已经执行),你可以通过'Task.WhenAll''Await':'Results = Await Task.WhenAll(taskList)'。结果值是一个字符串数组。 –
哇!好东西。谢谢。 – user2341148