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

Asynchronous 控制台应用程序中的HttpClient PostAsync调用未完成,asynchronous,console-application,httpclient,Asynchronous,Console Application,Httpclient,我试图从控制台应用程序向web api发送100条消息。但是程序在将消息发送到web api之前结束。如果我放置Console.ReadLine()最后,它正在工作。有人能帮我解决这个问题吗 我已经在下面发布了我使用的代码 static void Main(string[] args) { CreateLog(); } private static void CreateLog() { for(int i=0;i<100;i++) ProcessLog(new L

我试图从控制台应用程序向web api发送100条消息。但是程序在将消息发送到web 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);
}
static void Main(字符串[]args)
{
CreateLog();
}
私有静态void CreateLog()
{

对于(int i=0;i,进程在所有线程完成其工作之前退出。当进程退出时,其所有线程都将关闭到。唯一可能的情况是等待此任务完成其工作。可以使用方法
wait

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

当您想并行运行某些任务,然后等待它们找到时,您可以使用
continuewhalll

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
});

可以找到这两个方法的更多详细信息。

如果我使用result.wait(),它将不再是异步的。是的。但这里的问题是,当进程结束时,您的异步操作仍在运行,这意味着操作中断。在某个时刻,您必须等待线程。好的。如果像这样为(int i=0;iI不太明白你的意思,但我猜一下。我猜你想发布web请求,不要等待结果并运行刚才发布的for循环。因此,只需将我建议的结果变量设为全局变量,或者将其从括号中去掉,然后调用result.wait()在控制台应用程序的最后一行中,确保在结束流程之前操作已结束
XYZ()
Task.WaitAll(tasks.ToArray()):
// or 
await Task.WhenAll(task.ToArray());