httpClient.postAsync - 即发即弃 - 异步混淆
httpClient.postAsync - Fire-and-Forget - Async Confusion
我有一个 vb 控制台应用程序 充当桌面应用程序的中继 - post 将数据传输到在线服务。
因为post比较大而且频繁,我的本意是'fire and forget'。也就是说,我希望控制台应用程序post数据并且从不等待响应(我控制在线服务,错误可以在另一端处理)。
httpClient postAsync()
似乎是一个简单的解决方案,但我对术语感到困惑 - 尽管阅读了各种有用的 post 发现 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 posts 同时发生(或非常快速地连续发生)和仅 return 任何错误(例如响应代码 <> 200)并且仅在 所有 post 之后制作?
Ultimately, it seems that the way...
所有异步方法都应该是 Function
和 return Task
(或 Task (of T)
),除非它们正在实现事件处理程序。
Is not the point of Async / Await to...
您实际上并没有在发布的代码中使用 Async
或 Await
。 Result
不是 用于异步任务;使用 Await
代替。由于您正在编写控制台应用程序,您最终会发现您确实需要在 Main
方法中阻塞一次以防止应用程序退出。您可以在单个顶级任务中使用 GetAwaiter().GetResult()
来执行此操作。
allow multiple http posts to occur simultaneously
通过保存 Task
(例如,在 List (of Task)
中)而不是立即使用 Await
,然后将任务集合传递给
,最容易实现异步并发Task.WhenAll
和 Await
那个。
我有一个 vb 控制台应用程序 充当桌面应用程序的中继 - post 将数据传输到在线服务。
因为post比较大而且频繁,我的本意是'fire and forget'。也就是说,我希望控制台应用程序post数据并且从不等待响应(我控制在线服务,错误可以在另一端处理)。
httpClient postAsync()
似乎是一个简单的解决方案,但我对术语感到困惑 - 尽管阅读了各种有用的 post 发现 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 posts 同时发生(或非常快速地连续发生)和仅 return 任何错误(例如响应代码 <> 200)并且仅在 所有 post 之后制作?
Ultimately, it seems that the way...
所有异步方法都应该是 Function
和 return Task
(或 Task (of T)
),除非它们正在实现事件处理程序。
Is not the point of Async / Await to...
您实际上并没有在发布的代码中使用 Async
或 Await
。 Result
不是 用于异步任务;使用 Await
代替。由于您正在编写控制台应用程序,您最终会发现您确实需要在 Main
方法中阻塞一次以防止应用程序退出。您可以在单个顶级任务中使用 GetAwaiter().GetResult()
来执行此操作。
allow multiple http posts to occur simultaneously
通过保存 Task
(例如,在 List (of Task)
中)而不是立即使用 Await
,然后将任务集合传递给
,最容易实现异步并发Task.WhenAll
和 Await
那个。