我有这个非常简单的WebApi方法:
[HttpGet]
public IHttpActionResult Foo()
{
Thread.Sleep(3000);
return Ok("Bar");
}
我在调用它的控制台应用程序中有这两种方法:
async Task UsingWebClient()
{
Task<string> task = new WebClient().DownloadStringTaskAsync (new Uri ("http://localhost.fiddler:63710/api/producttype/Foo"));
Console.WriteLine("WebClient - Before calling wait");
string result = await task;
Console.WriteLine("WebClient - After calling wait");
}
async Task UsingHttpClient()
{
Task<string> task = new HttpClient().GetStringAsync (new Uri ("http://localhost.fiddler:63710/api/producttype/Foo"));
Console.WriteLine("HttpClient - Before calling wait");
string result = await task;
Console.WriteLine("HttpClient - After calling wait");
}
我从LinqPad这样调用这些方法:
async Task Main()
{
await UsingWebClient();
await UsingHttpClient();
}
我正在使用Fiddler监控流量,我注意到了:
我正在尝试理解为什么在使用HttpClient时不会立即发出请求。有人能指出我正确的方向吗?
这不是一个重复的问题。我不是在寻找选择一个选项的理由 - 我将使用HttpClient。我想具体了解为什么在使用HttpClient时会在稍后阶段创建请求。
谢谢, 大卫
答案 0 :(得分:1)
由于这两个请求都是异步的,因此它们都不应该延迟执行当前线程(显着)。
但是,有可能其中一个可以在当前线程到达下一行之前发送请求,而另一个则不能。
这些时序问题可能发生在异步/并行环境中,只要您不将逻辑上连续的操作分开就无需担心。