private async Task <List <T> > LoadList1 <T>(string setKey, int minutes = int.MinValue, CancellationToken cancellationToken = default) where T : Entity { var sw = Stopwatch.StartNew(); _logger.LogDebug("LoadList1 started"); var items = new List <T>(); var idsListValue = await CacheClient.GetSetAsync <string>(setKey).ConfigureAwait(false); if (idsListValue == null) { return(new List <T>()); } if (idsListValue.HasValue) { var idList = idsListValue.Value; if (idList == null) { return(new List <T>()); } if (IsEmptyList(idList)) { return(items); } var cacheValues = await CacheClient.GetAllAsync <T>(idList).ConfigureAwait(false); items.AddRange(cacheValues.Values.Where(x => x.HasValue).Select(x => x.Value)); if (cacheValues.Any(x => !x.Value.HasValue)) { _logger.LogDebug("Load1: Loading some Missing Cache Values - {Key}", setKey); var expiresIn = GetExpiresIn(minutes); var loadedIds = items.Select(x => x.EntityId).Where(x => !string.IsNullOrEmpty(x)).ToArray(); var allMissingIds = idList.Where(id => !loadedIds.Contains(id)).ToArray(); foreach (var missingIds in Split(allMissingIds, _options.CacheLoadSplitSize)) { var entities = await _entityStore.LoadItemsAsync <T>(x => missingIds.Contains(x.EntityId), cancellationToken).ConfigureAwait(false); if (entities == null) { return(items); } var tasks = new List <Task>(); foreach (var item in entities) { tasks.Add(CacheClient.AddAsync(item.EntityId, item, expiresIn)); items.Add(item); } await Task.WhenAll(tasks).ConfigureAwait(false); } } } sw.Stop(); _logger.LogDebug("LoadList1 finished in {Elapsed} ms", sw.ElapsedMilliseconds); return(items); }