为什么 HttpClient.PostAsync() 在控制台应用程序中没有完成,但在 Web 应用程序中完成?

Why is HttpClient.PostAsync() is not finished in Cosnole Application but finished in Web Application?

我在控制台应用程序中使用了以下代码,post 在我使用 Console.Read() 之前调用没有完成;最后或 client.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);
    }

这是一个经典的例子race condition。您指望它在控制台应用程序完成之前完成,但不能保证(除非明确等待)它会实际发生。事实上,使用您发布的代码,您将 几乎肯定 有许多调用在您到达 Console.Write() 调用时尚未完成。

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

您必须有某种方式在退出之前等待所有调用完成。