为什么 HttpClient.PostAsync() 在控制台应用程序中没有完成,但在 Web 应用程序中完成?
Why is HttpClient.PostAsync() is not finished in Cosnole Application but finished in Web Application?
我在控制台应用程序中使用了以下代码,post 在我使用 Console.Read() 之前调用没有完成;最后或 client.PostAsync("api/xxx", contentPost).wait()。
但在 Web 应用程序中,我不必使用任何 wait() 方法。我不想使用 wait() 方法。有人可以帮我解决这个问题吗?
static void Main(string[] args)
{
CreateLog();
}
private static void CreateLog()
{
for(int i=0;i<100;i++)
ProcessLog(new LogMessage() {
});
Console.Write("Press Enter to exit");
Console.ReadLine();
}
private static void ProcessLog(LogMessage message)
{
//Post message to web service
HttpClient client = new HttpClient();
// ConfigurationSettings.GetConfig("web api")
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);
}
这是一个经典的例子race condition。您指望它在控制台应用程序完成之前完成,但不能保证(除非明确等待)它会实际发生。事实上,使用您发布的代码,您将 几乎肯定 有许多调用在您到达 Console.Write() 调用时尚未完成。
这里的不同之处在于,您的控制台应用程序将在您按某个键进入后立即终止。 Console.Read() 用作 事实上的 Wait() 调用,但绝对不能保证用户实际上会等待足够长的时间让所有调用完成。 Web 应用程序的生命周期与控制台应用程序完全不同,因此它们不一定会在您完成调用后立即关闭。
您必须有某种方式在退出之前等待所有调用完成。
我在控制台应用程序中使用了以下代码,post 在我使用 Console.Read() 之前调用没有完成;最后或 client.PostAsync("api/xxx", contentPost).wait()。 但在 Web 应用程序中,我不必使用任何 wait() 方法。我不想使用 wait() 方法。有人可以帮我解决这个问题吗?
static void Main(string[] args)
{
CreateLog();
}
private static void CreateLog()
{
for(int i=0;i<100;i++)
ProcessLog(new LogMessage() {
});
Console.Write("Press Enter to exit");
Console.ReadLine();
}
private static void ProcessLog(LogMessage message)
{
//Post message to web service
HttpClient client = new HttpClient();
// ConfigurationSettings.GetConfig("web api")
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);
}
这是一个经典的例子race condition。您指望它在控制台应用程序完成之前完成,但不能保证(除非明确等待)它会实际发生。事实上,使用您发布的代码,您将 几乎肯定 有许多调用在您到达 Console.Write() 调用时尚未完成。
这里的不同之处在于,您的控制台应用程序将在您按某个键进入后立即终止。 Console.Read() 用作 事实上的 Wait() 调用,但绝对不能保证用户实际上会等待足够长的时间让所有调用完成。 Web 应用程序的生命周期与控制台应用程序完全不同,因此它们不一定会在您完成调用后立即关闭。
您必须有某种方式在退出之前等待所有调用完成。