2013-07-11 90 views
0

我无法找到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服务的回复,但基于我的突破点,它似乎正在同步运行。

回答

0

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

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)。

+0

这是谜题的一半,因为我的代码不正确。非常感谢您解决它。现在它是正确的,并且将控制权还给了调用者,但它仍然不是我所期望的。它在进入列表中的下一个项目之前等待第一个Web服务调用完成。如果我想让循环同时发出调用,我是否应该使用除async之外的其他功能(例如Parallel.ForEach)?实质上,我想一次性发布所有的Web服务调用,而不是一次一个。 – user2341148

+0

你可以通过调用'PostSecureXMLAsync'并保存任务来启动它们,而不是等待它(你可以通过'For Each'循环来创建一个任务列表,或者使用LINQ'Select'表达)。一旦你有一个任务列表(已经执行),你可以通过'Task.WhenAll''Await':'Results = Await Task.WhenAll(taskList)'。结果值是一个字符串数组。 –

+0

哇!好东西。谢谢。 – user2341148