我無法找到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