Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net httpClient.postAsync-触发并忘记-异步混淆_Vb.net_Async Await_Console Application_Dotnet Httpclient - Fatal编程技术网

Vb.net httpClient.postAsync-触发并忘记-异步混淆

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

我有一个vb控制台应用程序,它充当桌面应用程序的中继—将数据发布到在线服务

因为帖子比较多,比较频繁,所以我的意图是“炒了就忘了”。也就是说,我希望控制台应用程序能够发布数据,并且从不等待响应(我控制在线服务,错误可以在另一端处理)

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