【发布时间】:2016-09-27 00:55:06
【问题描述】:
我有一个简单的 MVC 控制器,我使用 await Task.WhenAll 从 Web 服务获取数据进行了异步处理。我想缓存这些调用的结果,这样我就不必一直调用 API。目前,当我得到响应时,我正在视图控制器中缓存结果,但理想情况下,我希望我正在调用的方法(它调用 API)来处理缓存。问题是该方法还不能访问结果,因为它是异步的并且只返回一个任务。
是否有可能有另一种方法在返回结果后对其进行缓存?
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>());
}
}
【问题讨论】:
标签: c# asp.net asp.net-mvc caching asynchronous