使用HttpClient时,避免从异步函数返回类型Task <Object>

Bla*_*ell 5 c# asp.net-mvc httpclient async-await asp.net-web-api

我正在使用System.Net.Http.HttpClient.进行HTTP调用.似乎所有调用都必须是异步的.

假设我有以下项目结构:MVC Web App - > Business Layer - > Data Layer

在数据层中,我正在对Web API进行HTTP调用以返回数据,最后我使用如下函数:

public async Task<IList<Product>> GetProducts()
{
     HttpResponseMessage response = await client.GetAsync("api/products");
     string data = await response.Content.ReadAsStringAsync();
     IList<Product> products = JsonConvert.DeserializeObject<IList<Product>>(data);

     return products;
}
Run Code Online (Sandbox Code Playgroud)

然后进入BusinessLayer:

public Task<IList<Product>> GetProducts(string name = null)
{
     return _repository.GetProducts(name);
}
Run Code Online (Sandbox Code Playgroud)

最后在MVC控制器中:

public IActionResult Index()
{
    Task<IList<Product>> ProductsTask = _manager.GetProducts();

    IList<Product> ProductsNonTask = products.Result.ToList();

    return View();
}
Run Code Online (Sandbox Code Playgroud)

我是否真的必须让每个函数返回一个类型列表,Task<IList<Product>>直到我的MVC控制器?正如你在MVC控制器中看到的那样,我必须首先检索产品,并将Task包裹起来.当我通过它查看产品列表时,调试器看起来很奇怪.那么你可以看到我将它们转换为常规的产品列表.

我想知道是否正确的做法是让我的所有函数返回类型Task<IList<Product>>一直到我的MVC控制器,或者如果有一个解决方法,以便我的函数仍然可以返回标准的产品列表但继续使用的异步功能HttpClient

更新:执行以下操作有什么问题:

public IList<Product> GetProducts()
{
     Task<HttpResponseMessage> response = client.GetAsync("api/products");
     if (response.Result.IsSuccessStatusCode)
     {
          string data = response.Result.Content.ReadAsStringAsync().Result;
          IList<Product> products = JsonConvert.DeserializeObject<IList<Product>>(data);

          retVal = products;
     }
}
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 7

如果您希望操作实际上是异步的,那么它需要一直异步.

那一刻你块上的TaskWaitResult它不再是异步的.

所以不行.要么一直使用异步,要么根本不使用它.

我想知道...如果有一个解决方法,以便我的函数仍然可以返回标准的产品列表,但继续使用HttpClient的异步功能?

不,没有真的.

您应该只是使代码异步,因为它在可伸缩性和性能方面具有许多优点.但如果您反对这样做,您可以使用WebClient具有同步Web操作的方法.

  • @BlakeRivell [`WebClient`](https://msdn.microsoft.com/en-us/library/system.net.webclient(v = vs.110).aspx)及其[`DownloadString(string)`]( https://msdn.microsoft.com/en-us/library/fhd1f0sw(v=vs.110).aspx)方法. (2认同)