Я написал метод, который должен получить некоторую информацию от веб-службы. Я хочу избежать дополнительных вызовов службы, поэтому я пытаюсь поместить информацию в MemoryCache согласно этому сообщению.
Разница в том, что у меня нет "SomeHeavyAndExpensiveCalculation" на клиенте, а я делегирую работу веб-сервису. Поэтому я хочу дождаться звонка.
Насколько я понимаю, с текущей реализацией у меня может быть несколько запросов к веб-серверу, потому что я не могу ждать запроса внутри блокировки, и поэтому он перемещен из блокировки.
Есть ли лучшее решение?
Спасибо.
private static readonly object CompanyInfoLock = new object();
public async Task<CompanyDto> GetCompanyInfo()
{
const string cacheKey = "_COMPANYINFO_";
CompanyDto companyInfo = MemoryCache.Default[cacheKey] as CompanyDto;
if (companyInfo != null) return companyInfo;
CompanyDto company = await _userManagementService.InvokeAsync(x => x.GetCompanyAsync(AppPrincipal.Current.CurrentCompanyId));
lock (CompanyInfoLock)
{
companyInfo = MemoryCache.Default[cacheKey] as CompanyDto;
if (companyInfo != null) return companyInfo;
MemoryCache.Default.Add(cacheKey, company, new CacheItemPolicy
{
SlidingExpiration = new TimeSpan(2, 0, 0)
});
}
return company;
}