Vb.net httpClient.postAsync-触发并忘记-异步混淆
我有一个vb控制台应用程序,它充当桌面应用程序的中继—将数据发布到在线服务 因为帖子比较多,比较频繁,所以我的意图是“炒了就忘了”。也就是说,我希望控制台应用程序能够发布数据,并且从不等待响应(我控制在线服务,错误可以在另一端处理)Vb.net httpClient.postAsync-触发并忘记-异步混淆,vb.net,async-await,console-application,dotnet-httpclient,Vb.net,Async Await,Console Application,Dotnet Httpclient,我有一个vb控制台应用程序,它充当桌面应用程序的中继—将数据发布到在线服务 因为帖子比较多,比较频繁,所以我的意图是“炒了就忘了”。也就是说,我希望控制台应用程序能够发布数据,并且从不等待响应(我控制在线服务,错误可以在另一端处理) httpClient postAsync()似乎是一个简单的解决方案,但我对这个术语感到困惑——尽管我阅读了各种有用的文章 最终,实现我想要做的事情的方法似乎是使用Sub而不是函数,如下所示(这被Sub Main()调用): 首先,这似乎令人困惑且违反直觉。Asyn
httpClient postAsync()
似乎是一个简单的解决方案,但我对这个术语感到困惑——尽管我阅读了各种有用的文章
最终,实现我想要做的事情的方法似乎是使用Sub
而不是函数,如下所示(这被Sub Main()
调用):
首先,这似乎令人困惑且违反直觉。Async/Await
的目的不是防止死锁并允许多个任务同时运行吗
其次,我将如何包装此子文件
(可能是一个函数
),以便允许多个http POST同时发生(或非常快速地连续发生),并且仅在所有POST完成后返回任何错误(例如,响应代码200)
最终看来,这条路
所有异步方法都应该是Function
并返回Task
(或Task(of T)
),除非它们实现了事件处理程序
不是异步/等待到的点
您在发布的代码中实际上没有使用Async
或wait
<代码>结果
不适用于异步任务;改用wait
。由于您正在编写一个控制台应用程序,最终会发现您确实需要在Main
方法中阻塞一次,以防止应用程序退出。您可以在单个顶级任务上使用GetAwaiter().GetResult()
来完成此操作
允许同时发生多个http POST
异步并发最容易通过保存
任务(例如,在列表(任务)
中)来实现,而不是立即使用等待,然后将任务集合传递给任务。当所有的和等待等待时,结果将被阻止。只需删除调用postasync的第二行代码,该函数将在不等待的情况下返回。谢谢,但删除Dim response=httpClient.postasync(url,httpContent)。Result
意味着http请求永远不会触发。我想触发并忘记-所以我想触发,但我不想等待返回的结果。result
…请求确实会触发,只是正在运行的线程在它可以做任何事情之前被杀死了。仅用于演示,在httpClient.PostAsync(url,httpContent)
之后执行Thread.Sleep(1000)。我不知道您是如何监视该请求的,但您将能够看到它确实被命中。你仍然可以同时使用wait
,这样你最终可能会这样做。我会尝试一下,但我认为斯蒂芬·克利里已经提供了我想要的答案。谢谢,有些事告诉我你可以信任他。谢谢Stephen-所以我真的需要一个三级解决方案,底部是“executive”函数,返回列表(任务)
,这个函数调用executive函数,等待并处理返回的列表(任务)
,顶部是Sub Main()
哪个调用中间层函数?现在我将离开并尝试…在控制台应用程序中,我建议让您的Sub-Main()
只需调用MainAsync().GetAwaiter().GetResult()
,其中MainAsync
是一个异步函数(任务)
。在该mainsync
中,您可以创建任务列表并将其传递给Task.whalll
。
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