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

时间:2016-07-29 15:10:41

标签: 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 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);
}

1 个答案:

答案 0 :(得分:1)

在所有线程完成工作之前,进程退出。当进程退出所有线程时关闭。您唯一可能的是等待此任务完成其工作。方法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