为什么是HttpClient.PostAsync()未在Cosnole应用程序中完成,但在Web应用程序中已完成

本文关键字:应用程序 但在 已完成 Web Cosnole HttpClient PostAsync 未在 为什么 | 更新日期: 2023-09-27 17:59:18

我在控制台应用程序中使用了以下代码,在使用控制台之前,后期调用不会完成。Read();在末端或客户端。PostAsync("api/xxx",contentPost).wait()。但在web应用程序中,我不必使用任何wait()方法。我不想使用wait()方法。有人能帮我解决这个问题吗。

   static void Main(string[] args)
    {
        CreateLog();
    }
    private static void CreateLog()
    {
        for(int i=0;i<100;i++)
        ProcessLog(new LogMessage() {
        });
        Console.Write("Press Enter to exit");
        Console.ReadLine();
    }
    private static void ProcessLog(LogMessage message)
    {

        //Post message to web service
        HttpClient client = new HttpClient();
        // ConfigurationSettings.GetConfig("web api")
        client.BaseAddress = new Uri(@"web api url");
        client.DefaultRequestHeaders.Accept.Add(
           new MediaTypeWithQualityHeaderValue("application/json"));                   
        HttpContent contentPost = new StringContent(JsonConvert.SerializeObject(message), Encoding.UTF8, "application/json");
        client.PostAsync("api/xxx", contentPost);
    }

为什么是HttpClient.PostAsync()未在Cosnole应用程序中完成,但在Web应用程序中已完成

这是竞赛条件的一个经典示例。你指望这能在Console应用程序之前完成,但不能保证(除了明确等待)这会真正发生。事实上,使用您发布的代码,您几乎可以肯定有许多调用在到达控制台时尚未完成。Write()调用。

这里的区别在于,您的控制台应用程序将在您按下某个键进入后立即终止。控制台。Read()实际上是一个Wait()调用,但绝对不能保证用户会等待足够长的时间来完成所有调用。Web应用程序的生命周期与Console应用程序完全不同,因此它们不一定会在您完成调用后立即关闭。

在退出之前,您必须有某种方式等待所有通话完成。

相关文章: