我有一個簡單的MVC控制器,我做了異步,它使用await Task.WhenAll從Web服務獲取數據。我想緩存這些調用的結果,所以我不必一直調用API。目前,當我得到響應時,我在視圖控制器中緩存結果,但理想情況下,我希望調用該API的方法來處理緩存。問題在於該方法無法訪問結果,因爲它是異步的,只是返回一個任務。從ASP.NET中的異步方法緩存結果
是否有可能有另一種方法緩存結果後,他們返回?
public async Task<ActionResult> Index()
{
// Get data asynchronously
var languagesTask = GetDataAsync<List<Language>>("languages");
var currenciesTask = GetDataAsync<List<Currency>>("currencies");
await Task.WhenAll(languagesTask, currenciesTask);
// Get results
List<Language> languages = languagesTask.Result;
List<Currency> currencies = currenciesTask.Result;
// Add results to cache
AddToCache("languages", languages);
AddToCache("currencies", currencies);
// Add results to view and return
ViewBag.languages = languages;
ViewBag.currencies = currencies;
return View();
}
public async Task<T> GetDataAsync<T>(string operation)
{
// Check cache for data first
string cacheName = operation;
var cacheData = HttpRuntime.Cache[cacheName];
if (cacheData != null)
{
return (T)cacheData;
}
// Get data from remote api
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri("https://myapi.com/");
var response = await client.GetAsync(operation);
// Add result to cache
//...
return (await response.Content.ReadAsAsync<T>());
}
}
https://stackoverflow.com/questions/31831860/async-threadsafe-get-from-memorycache – 2017-07-08 14:26:12