【问题标题】:HttpClient PostAsync call in Console application is not finishing控制台应用程序中的 HttpClient PostAsync 调用未完成
【发布时间】:2016-07-29 15:10:40
【问题描述】:

我正在尝试从控制台应用程序向 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);
}

【问题讨论】:

    标签: asynchronous console-application httpclient


    【解决方案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

    【讨论】:

    • 如果我使用 result.wait() ,它将不再是异步的。
    • 是的。但这里的问题是,当进程结束时,您的异步操作仍在运行,这意味着操作中断。在某些时候你必须等待线程..
    • ok。如果像这样调用方法 XYZ() for(int i=0;i
    • 我不太明白你的意思,但我会猜测一下。我假设您要发布网络请求,不要等待结果并运行您刚刚发布的 for 循环。所以只需将我建议的结果变量设为全局变量或将其从括号中取出并在控制台应用程序的最后一行调用 result.Wait() 以确保在结束进程之前操作已经结束
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2016-01-04
    相关资源
    最近更新 更多