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...

您实际上并没有在发布的代码中使用 AsyncAwaitResult 不是 用于异步任务;使用 Await 代替。由于您正在编写控制台应用程序,您最终会发现您确实需要在 Main 方法中阻塞一次以防止应用程序退出。您可以在单个顶级任务中使用 GetAwaiter().GetResult() 来执行此操作。

allow multiple http posts to occur simultaneously

通过保存 Task(例如,在 List (of Task) 中)而不是立即使用 Await,然后将任务集合传递给

,最容易实现异步并发Task.WhenAllAwait 那个。