我有一个vb 控制台应用程序,它作为桌面应用程序的中继 - 将数据发布到在线服务。
由于帖子相对较大且频繁,我的意图是“开除并忘记”。也就是说,我希望控制台应用程序发布数据并且永远不会等待响应(我控制在线服务,并且可以在另一端处理错误)。
httpClient postAsync()
似乎是一个简单的解决方案,但我对术语感到困惑 - 尽管已阅读了各种有用的帖子here
最终,实现我想要做的事情的方法似乎是使用Sub
而不是Function
,如下所示(这由Sub Main()
调用):
Public Sub POSTRequest(ByVal url As String, ByVal data As String, ByVal format As String)
Dim content_type As String = ""
Select Case format
Case "xml"
content_type = "application/xml"
Case "json"
content_type = "application/json"
Case "form"
content_type = "application/x-www-form-urlencoded"
End Select
Try
Dim httpClient As HttpClient = New HttpClient()
Dim httpContent = New StringContent(data, Encoding.UTF8, content_type)
httpClient.PostAsync(url, httpContent)
Dim response = httpClient.PostAsync(url, httpContent).Result
'I DON'T CARE ABOUT THE VALUE OF RESPONSE, SO NOTHING IS RETURNED...
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End Sub
首先,这似乎令人困惑和反直觉。 Async / Await
阻止死锁并且允许多个任务同时运行不是重点吗?
其次,我将如何包装此Sub
(可能是Function
),以便允许多个http帖子同时(或非常快速地连续)和仅 >返回任何错误(例如回复代码<> 200)并且仅在所有之后发布帖子?
答案 0 :(得分:1)
最终,似乎就是......
所有异步方法都应该是Function
并返回Task
(或Task (of T)
),除非他们正在实现事件处理程序。
Async / Await不是......
您实际上并未在发布的代码中使用Async
或Await
。 Result
不旨在用于异步任务;请改用Await
。由于您正在编写控制台应用程序,因此您最终会发现需要在Main
方法中阻止一次 - 以防止应用程序退出。您可以在单个顶级任务中使用GetAwaiter().GetResult()
执行此操作。
允许多个http帖子同时发生
异步并发最容易通过保存Task
(例如,在List (of Task)
中)而不是立即使用Await
,然后将任务集合传递给{{ 1}}和Task.WhenAll
那个。