控制台应用程序中的 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
});
或者您可以使用 WaitAll
或 WhenAll
方法。
XYZ()
Task.WaitAll(tasks.ToArray()):
// or
await Task.WhenAll(task.ToArray());
可以找到关于这两种方法的更多详细信息 here。
我正在尝试从控制台应用程序向 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
});
或者您可以使用 WaitAll
或 WhenAll
方法。
XYZ()
Task.WaitAll(tasks.ToArray()):
// or
await Task.WhenAll(task.ToArray());
可以找到关于这两种方法的更多详细信息 here。