Вы можете использовать асинхронность для достижения этой цели, однако лучше всего иметь асинхронную реализацию кода Entity Framework для добавления и извлечения.
Во-первых, я реорганизовал код, чтобы уменьшить дублирование и сделать его более читабельным, введя метод GetOrAddAsync
, этот метод принимает ключ кеша, логическое значение для useCaching
(для чего это нужно?) И делегат для ChartRenderingHelper
методов. Не сразу понятно, что типа currQuarter
и currYearType
.
private async Task<string> GetOrAddAsync(string cacheKey, bool useCaching, int cacheDays, DateTime currYear, ? currQuarter, ? currYearType, Action<string, string, string> cacheFactory)
{
if(DashboardCacheHelper.IsIncache(cacheKey, useCaching))
{
return DashboardCacheHelper.GetFromCache(cacheKey);
}
return (string)(await DashboardCacheHelper.SaveCacheAsync(bidsClosedKey, JsonConvert.SerializeObject(cacheFactory(currYear.ToString(), currQuarter.ToString(), currYearType.ToString())), DateTime.Now.AddDays(cacheDays)).ConfigureAwait(false))
}
При использовании вышеуказанного метода ваш код назначения становится
var bidsCreatedCacheTask = GetOrAddAsync(bidsCreatedKey, useCaching, cacheDays, currYear, currQuarter, currYearType, ChartRenderingHelper.GenerateBidsStatusCreated);
var bidsSubmittedCacheTask = GetOrAddAsync(bidsSubmittedKey, useCaching, cacheDays, currYear, currQuarter, currYearType, ChartRenderingHelper.GenerateBidsStatusSubmitted);
var bidsClosedCacheTask = GetOrAddAsync(bidsClosedKey, useCaching, cacheDays, currYear, currQuarter, currYearType, ChartRenderingHelper.GenerateBidsStatusClosed);
await Task.WhenAll(bidsCreatedCacheTask, bidsSubmittedCacheTask, bidsClosedCacheTask).ConfigureAwait(false);
bidsCreated.Value = await bidsCreatedCacheTask;
bidsSubmitted.Value = await bidsSubmittedCacheTask;
bidsClosed.Value = await bidsClosedCacheTask;
Одна ключевая вещь, которую нужно запомнить, - пометить ваш вызывающий метод как async
, если это обработчик события, то это будет async void
- но, пожалуйста, помните, что async void
в противном случае следует избегать в любом методе, который не является обработчиком событий - потому что вы ограничены типом возврата void
с обработчиком событий.
Как указал LeBigCat в комментариях, ConfigureAwait
следует использовать с асинхронным кодом, который выполняется в .NET Framework для предотвращения взаимных блокировок, прочитайте здесь , чтобы понять, почему.