httpClient.postAsync - Fire-and-Forget - 异步混淆

时间:2015-06-06 22:19:11

标签: vb.net async-await console-application dotnet-httpclient

我有一个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)并且仅在所有之后发布帖子?

1 个答案:

答案 0 :(得分:1)

  

最终,似乎就是......

所有异步方法都应该是Function并返回Task(或Task (of T)),除非他们正在实现事件处理程序。

  

Async / Await不是......

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

  

允许多个http帖子同时发生

异步并发最容易通过保存Task(例如,在List (of Task)中)而不是立即使用Await,然后将任务集合传递给{{ 1}}和Task.WhenAll那个。