2013-07-11 93 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