【问题标题】:WebClient vs. HttpClient - Async requestWebClient 与 HttpClient - 异步请求
【发布时间】:2015-04-29 15:13:53
【问题描述】:

我有这个非常简单的 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 - Before 呼叫等待");
  • 使用 HttpClient 时,不会向 Web api 发出请求,直到 调用 await 任务;

我试图理解为什么在使用 HttpClient 时没有立即发出请求。谁能指出我正确的方向?

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

谢谢, 大卫

【问题讨论】:

  • HttpClient 较新,可能为支持异步请求进行了更好的优化。
  • 只是为了确定:你多久测试一次,你真的确定你能真正决定什么时候发生了什么?
  • @CarstenKönig 我今天已经运行了很多次这些方法,我在 Fiddler 中看到的内容非常可预测。如果我在 UsingWebClient 方法的第二行设置断点,我可以清楚地看到请求已在 Fiddler 中发送。如果我在 UsingHttpClient 的第三行设置断点,我可以看到请求没有发送,只有在第三行执行后才发送。
  • 如果您先调用UsingHttpClient,然后再调用UsingWebClient,这些方法的行为方式是否相同?或者你注意到他们交换了行为吗?

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


【解决方案1】:

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

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

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

【讨论】:

  • 但是使用 WebClient 的代码将请求发送到 web api 的事实是否意味着它将更快地获得响应并提供更好的性能?
  • 这可能意味着,但不一定如此。他们初始化的时间可能会有所不同,在许多其他事情中也是如此。如果您想衡量他们的表现,那么就这样做吧 - 发送请求和获得响应之间的平均时间并不难衡量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多