WebClient与HttpClient - 异步请求

时间:2015-04-29 15:13:53

标签: c# asp.net-web-api async-await asp.net-web-api2

我有这个非常简单的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监控流量,我注意到了:

  • 使用WebClient时,会立即向web api发出请求 然后执行继续到Console.WriteLine(“WebClient - 之前 呼叫等待“);
  • 使用HttpClient时,才会对web api发出请求 呼吁等待任务;

我正在尝试理解为什么在使用HttpClient时不会立即发出请求。有人能指出我正确的方向吗?

这不是一个重复的问题。我不是在寻找选择一个选项的理由 - 我将使用HttpClient。我想具体了解为什么在使用HttpClient时会在稍后阶段创建请求。

谢谢, 大卫

1 个答案:

答案 0 :(得分:1)

由于这两个请求都是异步的,因此它们都不应该延迟执行当前线程(显着)。

但是,有可能其中一个可以在当前线程到达下一行之前发送请求,而另一个则不能。

这些时序问题可能发生在异步/并行环境中,只要您不将逻辑上连续的操作分开就无需担心。