我在控制台应用程序中使用了以下代码,在使用控制台之前,后期调用不会完成。Read();在末端或客户端。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);
}
这是竞赛条件的一个经典示例。你指望这能在Console应用程序之前完成,但不能保证(除了明确等待)这会真正发生。事实上,使用您发布的代码,您几乎可以肯定有许多调用在到达控制台时尚未完成。Write()调用。
这里的区别在于,您的控制台应用程序将在您按下某个键进入后立即终止。控制台。Read()实际上是一个Wait()调用,但绝对不能保证用户会等待足够长的时间来完成所有调用。Web应用程序的生命周期与Console应用程序完全不同,因此它们不一定会在您完成调用后立即关闭。
在退出之前,您必须有某种方式等待所有通话完成。