【发布时间】: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