控制台应用程序中的 HttpClient PostAsync 调用未完成

HttpClient PostAsync call in Console application is not finishing

我正在尝试从控制台应用程序向 Web api 发送 100 条消息。但是程序在将消息发送到网络之前就结束了 api。如果我把 Console.ReadLine(); 放在最后它就可以了。谁能帮我解决这个问题?

我已经在下面发布了我使用的代码。

static void Main(string[] args)
{
    CreateLog();
}

private static void CreateLog()
{
    for(int i=0;i<100;i++)
    ProcessLog(new LogMessage() { });         
}

private static void ProcessLog(LogMessage message)
{
    //Post message to web service
    HttpClient client = new HttpClient();
    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);
}

进程在所有线程完成工作之前退出。当进程退出时它的所有线程都关闭到。您唯一的可能就是等待此任务完成其工作。 Wait 方法可以用来做到这一点。

var result = client.PostAsync("api/xxx", contentPost);
result.Wait();

编辑

如果您想 运行 并行执行一些任务,然后等待它们完成,您可以使用 ContinueWhenAll.

List<Task> tasks = new List<Task>();
for(bla; bla; bla) {
    //run client posts async
    tasks.Add(client.PostAsync(bla, bla));
}
XYZ()
Task.Factory.ContinueWhenAll(tasks.ToArray(), (Task[] tasks) => {
    // run action when all are done
});

或者您可以使用 WaitAllWhenAll 方法。

XYZ()
Task.WaitAll(tasks.ToArray()):
// or 
await Task.WhenAll(task.ToArray());

可以找到关于这两种方法的更多详细信息 here