Asynchronous 控制台应用程序中的HttpClient PostAsync调用未完成
我试图从控制台应用程序向web api发送100条消息。但是程序在将消息发送到web api之前结束。如果我放置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
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());