[英]Avoid returning type Task<Object> from an async function when using HttpClient
我正在使用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;
}
然后進入BusinessLayer:
public Task<IList<Product>> GetProducts(string name = null)
{
return _repository.GetProducts(name);
}
最后在MVC控制器中:
public IActionResult Index()
{
Task<IList<Product>> ProductsTask = _manager.GetProducts();
IList<Product> ProductsNonTask = products.Result.ToList();
return View();
}
我是否真的必須讓每個函數都返回一個類型為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;
}
}
如果您希望操作實際上是異步的,那么它需要一直異步。
您在具有Wait
或Result
的Task
上阻止的那一刻它不再是異步的。
所以不行。 要么一直使用異步,要么根本不使用它。
我想知道...如果有一個解決方法,以便我的函數仍然可以返回標准的產品列表,但繼續使用HttpClient的異步功能?
不,沒有真的。
您應該只是使代碼異步,因為它在可伸縮性和性能方面具有許多優點。 但是,如果您反對這樣做,您可以使用具有同步Web操作的WebClient
。
我是否真的必須讓每個函數返回一個類型為Task>的列表導致我的MVC控制器?
是的,你必須和你甚至沒有趕上所有地方,因為Index
本身也必須是異步的。
異步真的很有感染力。 必要時使用,而不是默認使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.